<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "https://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/xhtml;charset=UTF-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9"/>
<meta name="generator" content="Doxygen 1.8.17"/>
<meta name="viewport" content="width=device-width, initial-scale=1"/>
<title>Win32k: exitwin.c 文件参考</title>
<link href="tabs.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript" src="dynsections.js"></script>
<link href="navtree.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="resize.js"></script>
<script type="text/javascript" src="navtreedata.js"></script>
<script type="text/javascript" src="navtree.js"></script>
<link href="search/search.css" rel="stylesheet" type="text/css"/>
<script type="text/javascript" src="search/searchdata.js"></script>
<script type="text/javascript" src="search/search.js"></script>
<link href="doxygen.css" rel="stylesheet" type="text/css" />
</head>
<body>
<div id="top"><!-- do not remove this div, it is closed by doxygen! -->
<div id="titlearea">
<table cellspacing="0" cellpadding="0">
 <tbody>
 <tr style="height: 56px;">
  <td id="projectalign" style="padding-left: 0.5em;">
   <div id="projectname">Win32k
   </div>
  </td>
 </tr>
 </tbody>
</table>
</div>
<!-- end header part -->
<!-- 制作者 Doxygen 1.8.17 -->
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
var searchBox = new SearchBox("searchBox", "search",false,'搜索');
/* @license-end */
</script>
<script type="text/javascript" src="menudata.js"></script>
<script type="text/javascript" src="menu.js"></script>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(function() {
  initMenu('',true,false,'search.php','搜索');
  $(document).ready(function() { init_search(); });
});
/* @license-end */</script>
<div id="main-nav"></div>
</div><!-- top -->
<div id="side-nav" class="ui-resizable side-nav-resizable">
  <div id="nav-tree">
    <div id="nav-tree-contents">
      <div id="nav-sync" class="sync"></div>
    </div>
  </div>
  <div id="splitbar" style="-moz-user-select:none;" 
       class="ui-resizable-handle">
  </div>
</div>
<script type="text/javascript">
/* @license magnet:?xt=urn:btih:cf05388f2679ee054f2beb29a391d25f4e673ac3&amp;dn=gpl-2.0.txt GPL-v2 */
$(document).ready(function(){initNavTree('a03239.html',''); initResizable(); });
/* @license-end */
</script>
<div id="doc-content">
<!-- window showing the filter options -->
<div id="MSearchSelectWindow"
     onmouseover="return searchBox.OnSearchSelectShow()"
     onmouseout="return searchBox.OnSearchSelectHide()"
     onkeydown="return searchBox.OnSearchSelectKey(event)">
</div>

<!-- iframe showing the search results (closed by default) -->
<div id="MSearchResultsWindow">
<iframe src="javascript:void(0)" frameborder="0" 
        name="MSearchResults" id="MSearchResults">
</iframe>
</div>

<div class="header">
  <div class="summary">
<a href="#nested-classes">结构体</a> &#124;
<a href="#define-members">宏定义</a> &#124;
<a href="#typedef-members">类型定义</a> &#124;
<a href="#func-members">函数</a> &#124;
<a href="#var-members">变量</a>  </div>
  <div class="headertitle">
<div class="title">server/exitwin.c 文件参考</div>  </div>
</div><!--header-->
<div class="contents">
<div class="textblock"><code>#include &quot;<a class="el" href="a03635_source.html">precomp.h</a>&quot;</code><br />
</div>
<p><a href="a03239_source.html">浏览源代码.</a></p>
<table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="nested-classes"></a>
结构体</h2></td></tr>
<tr class="memitem:"><td class="memItemLeft" align="right" valign="top">struct &#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03029.html">_ENDDLGPARAMS</a></td></tr>
<tr class="separator:"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="define-members"></a>
宏定义</h2></td></tr>
<tr class="memitem:a72f325200de1f3aabe8bf31e2f7fad87"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a72f325200de1f3aabe8bf31e2f7fad87">BEGIN_LPC_RECV</a>(API)</td></tr>
<tr class="separator:a72f325200de1f3aabe8bf31e2f7fad87"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7348244df100929b2981aeaf0f9f9ea0"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a7348244df100929b2981aeaf0f9f9ea0">END_LPC_RECV</a>()</td></tr>
<tr class="separator:a7348244df100929b2981aeaf0f9f9ea0"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aab5abd3edec726f9dd6d86c33e7725c4"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#aab5abd3edec726f9dd6d86c33e7725c4">CMDEND_APPSAYSOK</a>&#160;&#160;&#160;1</td></tr>
<tr class="separator:aab5abd3edec726f9dd6d86c33e7725c4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad213141f4fe1fd382bc14446b8e021c5"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#ad213141f4fe1fd382bc14446b8e021c5">CMDEND_APPSAYSNOTOK</a>&#160;&#160;&#160;2</td></tr>
<tr class="separator:ad213141f4fe1fd382bc14446b8e021c5"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad66fd118ce776a77cb84fad3ad8cbd29"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#ad66fd118ce776a77cb84fad3ad8cbd29">CMDEND_USERSAYSKILL</a>&#160;&#160;&#160;3</td></tr>
<tr class="separator:ad66fd118ce776a77cb84fad3ad8cbd29"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a8f11ce738c583d101e1ae328c351deac"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a8f11ce738c583d101e1ae328c351deac">CMDEND_USERSAYSCANCEL</a>&#160;&#160;&#160;4</td></tr>
<tr class="separator:a8f11ce738c583d101e1ae328c351deac"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aac6a5a74395a61a33c29e0478eb13945"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#aac6a5a74395a61a33c29e0478eb13945">CMDEND_NOWINDOW</a>&#160;&#160;&#160;5</td></tr>
<tr class="separator:aac6a5a74395a61a33c29e0478eb13945"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a7143e883c651100c3c38ffa2537c93ed"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a7143e883c651100c3c38ffa2537c93ed">CCHMSGMAX</a>&#160;&#160;&#160;256</td></tr>
<tr class="separator:a7143e883c651100c3c38ffa2537c93ed"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a413912b9bd1a3ecf1768857b40cdffaa"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a413912b9bd1a3ecf1768857b40cdffaa">CCHBODYMAX</a>&#160;&#160;&#160;512</td></tr>
<tr class="separator:a413912b9bd1a3ecf1768857b40cdffaa"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af69e84f5b4d6cc1a962ef7adb4848836"><td class="memItemLeft" align="right" valign="top">#define&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#af69e84f5b4d6cc1a962ef7adb4848836">CSR_THREAD_SHUTDOWNSKIP</a>&#160;&#160;&#160;0x00000008</td></tr>
<tr class="separator:af69e84f5b4d6cc1a962ef7adb4848836"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="typedef-members"></a>
类型定义</h2></td></tr>
<tr class="memitem:a92080566e5a06c7136a690c372bdadbd"><td class="memItemLeft" align="right" valign="top">typedef struct <a class="el" href="a03029.html">_ENDDLGPARAMS</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a92080566e5a06c7136a690c372bdadbd">ENDDLGPARAMS</a></td></tr>
<tr class="separator:a92080566e5a06c7136a690c372bdadbd"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="func-members"></a>
函数</h2></td></tr>
<tr class="memitem:a1235d4adf091dd34cf85292008e10212"><td class="memItemLeft" align="right" valign="top"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a1235d4adf091dd34cf85292008e10212">SendShutdownMessages</a> (HWND hwndDesktop, PCSR_THREAD pcsrt, <a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwClientFlags)</td></tr>
<tr class="separator:a1235d4adf091dd34cf85292008e10212"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4c3e71728419b51abac3cd3731c7891d"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a4c3e71728419b51abac3cd3731c7891d">WowExitTask</a> (PCSR_THREAD pcsrt)</td></tr>
<tr class="separator:a4c3e71728419b51abac3cd3731c7891d"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:adaea996c1b105ea7798e9b4763cb7135"><td class="memItemLeft" align="right" valign="top"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#adaea996c1b105ea7798e9b4763cb7135">MySendEndSessionMessages</a> (HWND hwnd, PCSR_THREAD pcsrt, BOOL fEndTask, <a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwClientFlags)</td></tr>
<tr class="separator:adaea996c1b105ea7798e9b4763cb7135"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a42d30cf3c3824180520a83ce6c62aeeb"><td class="memItemLeft" align="right" valign="top">NTSTATUS&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a42d30cf3c3824180520a83ce6c62aeeb">UserClientShutdown</a> (PCSR_PROCESS pcsrp, ULONG dwFlags, BOOLEAN fFirstPass)</td></tr>
<tr class="separator:a42d30cf3c3824180520a83ce6c62aeeb"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad251c3353b8caac862bb30255af684fa"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#ad251c3353b8caac862bb30255af684fa">BoostHardError</a> (<a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwProcessId, BOOL fForce)</td></tr>
<tr class="separator:ad251c3353b8caac862bb30255af684fa"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a6e1f93446f792e5b40d9bd6307c4430c"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a6e1f93446f792e5b40d9bd6307c4430c">DoEndTaskDialog</a> (WCHAR *pszTitle, HANDLE h, <a class="el" href="a03608.html#afd1a0e78d1f88954d93e48ab3821781f">UINT</a> <a class="el" href="a00563.html#a7b9b0ae15722c1f5e47208b05166acf3">type</a>, int cSeconds)</td></tr>
<tr class="separator:a6e1f93446f792e5b40d9bd6307c4430c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aa4be6119fd72c33b7a4a76bf7a72762c"><td class="memItemLeft" align="right" valign="top">NTSTATUS&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#aa4be6119fd72c33b7a4a76bf7a72762c">_ExitWindowsEx</a> (PCSR_THREAD pcsrt, <a class="el" href="a03608.html#afd1a0e78d1f88954d93e48ab3821781f">UINT</a> dwFlags, <a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwReserved)</td></tr>
<tr class="separator:aa4be6119fd72c33b7a4a76bf7a72762c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aadc5a0499586d2b3c2ce8b850dc53abd"><td class="memItemLeft" align="right" valign="top">BOOL CALLBACK&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#aadc5a0499586d2b3c2ce8b850dc53abd">FindWindowFromThread</a> (HWND hwnd, LPARAM lParam)</td></tr>
<tr class="separator:aadc5a0499586d2b3c2ce8b850dc53abd"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a25eb30750161d9f640fdb5da4da98d28"><td class="memItemLeft" align="right" valign="top">LONG <a class="el" href="a00962.html#a428a91acf2c2439dc1a257708ee1f805">APIENTRY</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a25eb30750161d9f640fdb5da4da98d28">EndTaskDlgProc</a> (HWND hwndDlg, <a class="el" href="a03608.html#afd1a0e78d1f88954d93e48ab3821781f">UINT</a> msg, <a class="el" href="a03608.html#afd1a0e78d1f88954d93e48ab3821781f">UINT</a> wParam, LONG lParam)</td></tr>
<tr class="separator:a25eb30750161d9f640fdb5da4da98d28"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:af72b486135dd980945ed91746e345a8a"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#af72b486135dd980945ed91746e345a8a">_EndTask</a> (HWND hwnd, BOOL fShutdown, BOOL fMeanKill)</td></tr>
<tr class="separator:af72b486135dd980945ed91746e345a8a"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ab7895dbdc5b191a5fd3eecbe22ca64a3"><td class="memItemLeft" align="right" valign="top"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#ab7895dbdc5b191a5fd3eecbe22ca64a3">InternalWaitCancel</a> (HANDLE handle, <a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwMilliseconds)</td></tr>
<tr class="separator:ab7895dbdc5b191a5fd3eecbe22ca64a3"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a9eb3f9f3d06aec70363cbde212183728"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a9eb3f9f3d06aec70363cbde212183728">InternalDoEndTaskDialog</a> (TCHAR *pszTitle, HANDLE h, int cSeconds)</td></tr>
<tr class="separator:a9eb3f9f3d06aec70363cbde212183728"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a33b594ea0681c07ef423632f5645ff39"><td class="memItemLeft" align="right" valign="top">HANDLE&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a33b594ea0681c07ef423632f5645ff39">InternalCreateCallbackThread</a> (HANDLE hProcess, <a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> lpfn, <a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwData)</td></tr>
<tr class="separator:a33b594ea0681c07ef423632f5645ff39"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4a81b319fb6b75f5ef48ab1746f5f39c"><td class="memItemLeft" align="right" valign="top">ULONG&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a4a81b319fb6b75f5ef48ab1746f5f39c">SrvExitWindowsEx</a> (IN OUT PCSR_API_MSG m, IN OUT PCSR_REPLY_STATUS ReplyStatus)</td></tr>
<tr class="separator:a4a81b319fb6b75f5ef48ab1746f5f39c"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a4ab8c3384e56e567d12c5017cb23d5e4"><td class="memItemLeft" align="right" valign="top">ULONG&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a4ab8c3384e56e567d12c5017cb23d5e4">SrvEndTask</a> (IN OUT PCSR_API_MSG m, IN OUT PCSR_REPLY_STATUS ReplyStatus)</td></tr>
<tr class="separator:a4ab8c3384e56e567d12c5017cb23d5e4"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:ad5164087ca1b77435e44c75a73c0538f"><td class="memItemLeft" align="right" valign="top">BOOL&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#ad5164087ca1b77435e44c75a73c0538f">IsPrivileged</a> (PPRIVILEGE_SET ppSet)</td></tr>
<tr class="separator:ad5164087ca1b77435e44c75a73c0538f"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:aaff0cdc89a60177fe38e42ec397b9606"><td class="memItemLeft" align="right" valign="top">ULONG&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#aaff0cdc89a60177fe38e42ec397b9606">SrvRegisterServicesProcess</a> (IN OUT PCSR_API_MSG m, IN OUT PCSR_REPLY_STATUS ReplyStatus)</td></tr>
<tr class="separator:aaff0cdc89a60177fe38e42ec397b9606"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table><table class="memberdecls">
<tr class="heading"><td colspan="2"><h2 class="groupheader"><a name="var-members"></a>
变量</h2></td></tr>
<tr class="memitem:a76588185d43cb97e9647d0765c2d7c7b"><td class="memItemLeft" align="right" valign="top"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a76588185d43cb97e9647d0765c2d7c7b">gdwFlags</a> = 0</td></tr>
<tr class="separator:a76588185d43cb97e9647d0765c2d7c7b"><td class="memSeparator" colspan="2">&#160;</td></tr>
<tr class="memitem:a03f0b7bae20eca44bfb023829e957e3b"><td class="memItemLeft" align="right" valign="top">int&#160;</td><td class="memItemRight" valign="bottom"><a class="el" href="a03239.html#a03f0b7bae20eca44bfb023829e957e3b">gcInternalDoEndTaskDialog</a> = 0</td></tr>
<tr class="separator:a03f0b7bae20eca44bfb023829e957e3b"><td class="memSeparator" colspan="2">&#160;</td></tr>
</table>
<h2 class="groupheader">宏定义说明</h2>
<a id="a72f325200de1f3aabe8bf31e2f7fad87"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a72f325200de1f3aabe8bf31e2f7fad87">&#9670;&nbsp;</a></span>BEGIN_LPC_RECV</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define BEGIN_LPC_RECV</td>
          <td>(</td>
          <td class="paramtype">&#160;</td>
          <td class="paramname">API</td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">
<b>值:</b><div class="fragment"><div class="line">    P##API##MSG a = (P##API##MSG)&amp;m-&gt;u.ApiMessageData;                      \</div>
<div class="line">    PCSR_THREAD pcsrt;                                                      \</div>
<div class="line">    PTEB Teb = NtCurrentTeb();                                              \</div>
<div class="line">    NTSTATUS Status = STATUS_SUCCESS;                                       \</div>
<div class="line">    UNREFERENCED_PARAMETER(ReplyStatus);                                    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">\</a></div>
<div class="line"><a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">                                                                            \</a></div>
<div class="line"><a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">    EnterCrit</a>();                                                            \</div>
<div class="line">    Teb-&gt;LastErrorValue = 0;                                                \</div>
<div class="line">    pcsrt = CSR_SERVER_QUERYCLIENTTHREAD();</div>
</div><!-- fragment -->
<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00016">16</a> 行定义.</p>

</div>
</div>
<a id="a413912b9bd1a3ecf1768857b40cdffaa"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a413912b9bd1a3ecf1768857b40cdffaa">&#9670;&nbsp;</a></span>CCHBODYMAX</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define CCHBODYMAX&#160;&#160;&#160;512</td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00042">42</a> 行定义.</p>

</div>
</div>
<a id="a7143e883c651100c3c38ffa2537c93ed"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7143e883c651100c3c38ffa2537c93ed">&#9670;&nbsp;</a></span>CCHMSGMAX</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define CCHMSGMAX&#160;&#160;&#160;256</td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00041">41</a> 行定义.</p>

</div>
</div>
<a id="ad213141f4fe1fd382bc14446b8e021c5"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad213141f4fe1fd382bc14446b8e021c5">&#9670;&nbsp;</a></span>CMDEND_APPSAYSNOTOK</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define CMDEND_APPSAYSNOTOK&#160;&#160;&#160;2</td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00036">36</a> 行定义.</p>

</div>
</div>
<a id="aab5abd3edec726f9dd6d86c33e7725c4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aab5abd3edec726f9dd6d86c33e7725c4">&#9670;&nbsp;</a></span>CMDEND_APPSAYSOK</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define CMDEND_APPSAYSOK&#160;&#160;&#160;1</td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00035">35</a> 行定义.</p>

</div>
</div>
<a id="aac6a5a74395a61a33c29e0478eb13945"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aac6a5a74395a61a33c29e0478eb13945">&#9670;&nbsp;</a></span>CMDEND_NOWINDOW</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define CMDEND_NOWINDOW&#160;&#160;&#160;5</td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00039">39</a> 行定义.</p>

</div>
</div>
<a id="a8f11ce738c583d101e1ae328c351deac"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a8f11ce738c583d101e1ae328c351deac">&#9670;&nbsp;</a></span>CMDEND_USERSAYSCANCEL</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define CMDEND_USERSAYSCANCEL&#160;&#160;&#160;4</td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00038">38</a> 行定义.</p>

</div>
</div>
<a id="ad66fd118ce776a77cb84fad3ad8cbd29"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad66fd118ce776a77cb84fad3ad8cbd29">&#9670;&nbsp;</a></span>CMDEND_USERSAYSKILL</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define CMDEND_USERSAYSKILL&#160;&#160;&#160;3</td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00037">37</a> 行定义.</p>

</div>
</div>
<a id="af69e84f5b4d6cc1a962ef7adb4848836"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af69e84f5b4d6cc1a962ef7adb4848836">&#9670;&nbsp;</a></span>CSR_THREAD_SHUTDOWNSKIP</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define CSR_THREAD_SHUTDOWNSKIP&#160;&#160;&#160;0x00000008</td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00044">44</a> 行定义.</p>

</div>
</div>
<a id="a7348244df100929b2981aeaf0f9f9ea0"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a7348244df100929b2981aeaf0f9f9ea0">&#9670;&nbsp;</a></span>END_LPC_RECV</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">#define END_LPC_RECV</td>
          <td>(</td>
          <td class="paramname"></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">
<b>值:</b><div class="fragment"><div class="line">    a-&gt;dwLastError = Teb-&gt;LastErrorValue;                               \</div>
<div class="line">    LeaveCrit();                                                        \</div>
<div class="line">    return Status;</div>
</div><!-- fragment -->
<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00027">27</a> 行定义.</p>

</div>
</div>
<h2 class="groupheader">类型定义说明</h2>
<a id="a92080566e5a06c7136a690c372bdadbd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a92080566e5a06c7136a690c372bdadbd">&#9670;&nbsp;</a></span>ENDDLGPARAMS</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">typedef struct <a class="el" href="a03029.html">_ENDDLGPARAMS</a> <a class="el" href="a03239.html#a92080566e5a06c7136a690c372bdadbd">ENDDLGPARAMS</a></td>
        </tr>
      </table>
</div><div class="memdoc">

</div>
</div>
<h2 class="groupheader">函数说明</h2>
<a id="af72b486135dd980945ed91746e345a8a"></a>
<h2 class="memtitle"><span class="permalink"><a href="#af72b486135dd980945ed91746e345a8a">&#9670;&nbsp;</a></span>_EndTask()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">BOOL _EndTask </td>
          <td>(</td>
          <td class="paramtype">HWND&#160;</td>
          <td class="paramname"><em>hwnd</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">BOOL&#160;</td>
          <td class="paramname"><em>fShutdown</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">BOOL&#160;</td>
          <td class="paramname"><em>fMeanKill</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l01055">1055</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l01059"></a><span class="lineno"> 1059</span>&#160;{</div>
<div class="line"><a name="l01060"></a><span class="lineno"> 1060</span>&#160;    PCSR_THREAD pcsrt = CSR_SERVER_QUERYCLIENTTHREAD();</div>
<div class="line"><a name="l01061"></a><span class="lineno"> 1061</span>&#160;    PCSR_THREAD pcsrtKill;</div>
<div class="line"><a name="l01062"></a><span class="lineno"> 1062</span>&#160;    <a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwThreadId;</div>
<div class="line"><a name="l01063"></a><span class="lineno"> 1063</span>&#160;    <a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwProcessId;</div>
<div class="line"><a name="l01064"></a><span class="lineno"> 1064</span>&#160;    LPWSTR lpszMsg;</div>
<div class="line"><a name="l01065"></a><span class="lineno"> 1065</span>&#160;    BOOL fAllocated;</div>
<div class="line"><a name="l01066"></a><span class="lineno"> 1066</span>&#160;    <a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwCmd;</div>
<div class="line"><a name="l01067"></a><span class="lineno"> 1067</span>&#160; </div>
<div class="line"><a name="l01068"></a><span class="lineno"> 1068</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01069"></a><span class="lineno"> 1069</span>&#160;<span class="comment">     * Note: fShutdown isn&#39;t used for anything in this routine!</span></div>
<div class="line"><a name="l01070"></a><span class="lineno"> 1070</span>&#160;<span class="comment">     * They are still there because I haven&#39;t removed them: the old endtask</span></div>
<div class="line"><a name="l01071"></a><span class="lineno"> 1071</span>&#160;<span class="comment">     * code relied on them.</span></div>
<div class="line"><a name="l01072"></a><span class="lineno"> 1072</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01073"></a><span class="lineno"> 1073</span>&#160;    UNREFERENCED_PARAMETER(fShutdown);</div>
<div class="line"><a name="l01074"></a><span class="lineno"> 1074</span>&#160; </div>
<div class="line"><a name="l01075"></a><span class="lineno"> 1075</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01076"></a><span class="lineno"> 1076</span>&#160;<span class="comment">     * Get the process and thread that owns hwnd.</span></div>
<div class="line"><a name="l01077"></a><span class="lineno"> 1077</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01078"></a><span class="lineno"> 1078</span>&#160;    dwThreadId = <a class="code" href="a00263.html#a1dc37c01a43d34053e1dbf4ee8e0da0a">GetWindowThreadProcessId</a>(hwnd, &amp;dwProcessId);</div>
<div class="line"><a name="l01079"></a><span class="lineno"> 1079</span>&#160;    <span class="keywordflow">if</span> (dwThreadId == 0)</div>
<div class="line"><a name="l01080"></a><span class="lineno"> 1080</span>&#160;        <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01081"></a><span class="lineno"> 1081</span>&#160; </div>
<div class="line"><a name="l01082"></a><span class="lineno"> 1082</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01083"></a><span class="lineno"> 1083</span>&#160;<span class="comment">     * If this is a console window, then just send the close message to</span></div>
<div class="line"><a name="l01084"></a><span class="lineno"> 1084</span>&#160;<span class="comment">     * it, and let console clean up the processes in it.</span></div>
<div class="line"><a name="l01085"></a><span class="lineno"> 1085</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01086"></a><span class="lineno"> 1086</span>&#160;    <span class="keywordflow">if</span> ((HANDLE)GetWindowLong(hwnd, GWL_HINSTANCE) == <a class="code" href="a03257.html#a4ae1966258068576cf2be4cc7356924b">hModuleWin</a>) {</div>
<div class="line"><a name="l01087"></a><span class="lineno"> 1087</span>&#160;        <a class="code" href="a00356.html#a3f53b9d5a549a62853c4e3fb22b649d7">PostMessage</a>(hwnd, WM_CLOSE, 0, 0);</div>
<div class="line"><a name="l01088"></a><span class="lineno"> 1088</span>&#160;        <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01089"></a><span class="lineno"> 1089</span>&#160;    }</div>
<div class="line"><a name="l01090"></a><span class="lineno"> 1090</span>&#160; </div>
<div class="line"><a name="l01091"></a><span class="lineno"> 1091</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01092"></a><span class="lineno"> 1092</span>&#160;<span class="comment">     * Find the CSR_THREAD for the window.</span></div>
<div class="line"><a name="l01093"></a><span class="lineno"> 1093</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01094"></a><span class="lineno"> 1094</span>&#160;    <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01095"></a><span class="lineno"> 1095</span>&#160;    CsrLockThreadByClientId((HANDLE)dwThreadId, &amp;pcsrtKill);</div>
<div class="line"><a name="l01096"></a><span class="lineno"> 1096</span>&#160;    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l01097"></a><span class="lineno"> 1097</span>&#160;    <span class="keywordflow">if</span> (pcsrtKill == NULL)</div>
<div class="line"><a name="l01098"></a><span class="lineno"> 1098</span>&#160;        <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01099"></a><span class="lineno"> 1099</span>&#160;    CsrReferenceThread(pcsrtKill);</div>
<div class="line"><a name="l01100"></a><span class="lineno"> 1100</span>&#160;    CsrUnlockThread(pcsrtKill);</div>
<div class="line"><a name="l01101"></a><span class="lineno"> 1101</span>&#160; </div>
<div class="line"><a name="l01102"></a><span class="lineno"> 1102</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01103"></a><span class="lineno"> 1103</span>&#160;<span class="comment">     * If this is a WOW app, then shutdown just this wow application.</span></div>
<div class="line"><a name="l01104"></a><span class="lineno"> 1104</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01105"></a><span class="lineno"> 1105</span>&#160;    <span class="keywordflow">if</span> (!fMeanKill) {</div>
<div class="line"><a name="l01106"></a><span class="lineno"> 1106</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l01107"></a><span class="lineno"> 1107</span>&#160;<span class="comment">         * Find out what to do now - did the user cancel or the app cancel,</span></div>
<div class="line"><a name="l01108"></a><span class="lineno"> 1108</span>&#160;<span class="comment">         * etc? Only allow cancelling if we are not forcing the app to</span></div>
<div class="line"><a name="l01109"></a><span class="lineno"> 1109</span>&#160;<span class="comment">         * exit.</span></div>
<div class="line"><a name="l01110"></a><span class="lineno"> 1110</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l01111"></a><span class="lineno"> 1111</span>&#160;        dwCmd = <a class="code" href="a03239.html#adaea996c1b105ea7798e9b4763cb7135">MySendEndSessionMessages</a>(hwnd, pcsrtKill, TRUE, 0);</div>
<div class="line"><a name="l01112"></a><span class="lineno"> 1112</span>&#160;        <span class="keywordflow">switch</span> (dwCmd) {</div>
<div class="line"><a name="l01113"></a><span class="lineno"> 1113</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="a03239.html#ad213141f4fe1fd382bc14446b8e021c5">CMDEND_APPSAYSNOTOK</a>:</div>
<div class="line"><a name="l01114"></a><span class="lineno"> 1114</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l01115"></a><span class="lineno"> 1115</span>&#160;<span class="comment">             * App says not ok - this&#39;ll let taskman bring up the &quot;are you sure?&quot;</span></div>
<div class="line"><a name="l01116"></a><span class="lineno"> 1116</span>&#160;<span class="comment">             * dialog to the user.</span></div>
<div class="line"><a name="l01117"></a><span class="lineno"> 1117</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l01118"></a><span class="lineno"> 1118</span>&#160;            CsrDereferenceThread(pcsrtKill);</div>
<div class="line"><a name="l01119"></a><span class="lineno"> 1119</span>&#160;            <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l01120"></a><span class="lineno"> 1120</span>&#160; </div>
<div class="line"><a name="l01121"></a><span class="lineno"> 1121</span>&#160;        <span class="keywordflow">case</span> <a class="code" href="a03239.html#a8f11ce738c583d101e1ae328c351deac">CMDEND_USERSAYSCANCEL</a>:</div>
<div class="line"><a name="l01122"></a><span class="lineno"> 1122</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l01123"></a><span class="lineno"> 1123</span>&#160;<span class="comment">             * User hit cancel on the timeout dialog - so the user really meant</span></div>
<div class="line"><a name="l01124"></a><span class="lineno"> 1124</span>&#160;<span class="comment">             * it. Let taskman know everything is ok by returning TRUE.</span></div>
<div class="line"><a name="l01125"></a><span class="lineno"> 1125</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l01126"></a><span class="lineno"> 1126</span>&#160;            CsrDereferenceThread(pcsrtKill);</div>
<div class="line"><a name="l01127"></a><span class="lineno"> 1127</span>&#160;            <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01128"></a><span class="lineno"> 1128</span>&#160;        }</div>
<div class="line"><a name="l01129"></a><span class="lineno"> 1129</span>&#160;    }</div>
<div class="line"><a name="l01130"></a><span class="lineno"> 1130</span>&#160; </div>
<div class="line"><a name="l01131"></a><span class="lineno"> 1131</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01132"></a><span class="lineno"> 1132</span>&#160;<span class="comment">     * Kill the application now.  If the thread has not been destroyed,</span></div>
<div class="line"><a name="l01133"></a><span class="lineno"> 1133</span>&#160;<span class="comment">     * nuke the task.  If WowExitTask returns that the thread is not</span></div>
<div class="line"><a name="l01134"></a><span class="lineno"> 1134</span>&#160;<span class="comment">     * a WOW task, terminate the process.</span></div>
<div class="line"><a name="l01135"></a><span class="lineno"> 1135</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01136"></a><span class="lineno"> 1136</span>&#160;    <span class="keywordflow">if</span> (!(pcsrtKill-&gt;Flags &amp; CSR_THREAD_DESTROYED) &amp;&amp; !<a class="code" href="a03239.html#a4c3e71728419b51abac3cd3731c7891d">WowExitTask</a>(pcsrtKill)) {</div>
<div class="line"><a name="l01137"></a><span class="lineno"> 1137</span>&#160; </div>
<div class="line"><a name="l01138"></a><span class="lineno"> 1138</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l01139"></a><span class="lineno"> 1139</span>&#160;<span class="comment">         * Calling ExitProcess() in the app&#39;s context will not always work</span></div>
<div class="line"><a name="l01140"></a><span class="lineno"> 1140</span>&#160;<span class="comment">         * because the app may have .dll termination deadlocks: so the thread</span></div>
<div class="line"><a name="l01141"></a><span class="lineno"> 1141</span>&#160;<span class="comment">         * will hang with the rest of the process. To ensure apps go away,</span></div>
<div class="line"><a name="l01142"></a><span class="lineno"> 1142</span>&#160;<span class="comment">         * we terminate the process with NtTerminateProcess().</span></div>
<div class="line"><a name="l01143"></a><span class="lineno"> 1143</span>&#160;<span class="comment">         *</span></div>
<div class="line"><a name="l01144"></a><span class="lineno"> 1144</span>&#160;<span class="comment">         * Pass this special value, DBG_TERMINATE_PROCESS, which tells</span></div>
<div class="line"><a name="l01145"></a><span class="lineno"> 1145</span>&#160;<span class="comment">         * NtTerminateProcess() to return failure if it can&#39;t terminate the</span></div>
<div class="line"><a name="l01146"></a><span class="lineno"> 1146</span>&#160;<span class="comment">         * process because the app is being debugged.</span></div>
<div class="line"><a name="l01147"></a><span class="lineno"> 1147</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l01148"></a><span class="lineno"> 1148</span>&#160;        <span class="keywordflow">if</span> (!NT_SUCCESS(NtTerminateProcess(pcsrtKill-&gt;Process-&gt;ProcessHandle,</div>
<div class="line"><a name="l01149"></a><span class="lineno"> 1149</span>&#160;                DBG_TERMINATE_PROCESS))) {</div>
<div class="line"><a name="l01150"></a><span class="lineno"> 1150</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l01151"></a><span class="lineno"> 1151</span>&#160;<span class="comment">             * If the app is being debugged, don&#39;t close it - because that can</span></div>
<div class="line"><a name="l01152"></a><span class="lineno"> 1152</span>&#160;<span class="comment">             * cause a hang to the NtTerminateProcess() call.</span></div>
<div class="line"><a name="l01153"></a><span class="lineno"> 1153</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l01154"></a><span class="lineno"> 1154</span>&#160;            lpszMsg = ServerLoadString(<a class="code" href="a03257.html#a4ae1966258068576cf2be4cc7356924b">hModuleWin</a>, STR_APPDEBUGGED,</div>
<div class="line"><a name="l01155"></a><span class="lineno"> 1155</span>&#160;                    NULL, &amp;fAllocated);</div>
<div class="line"><a name="l01156"></a><span class="lineno"> 1156</span>&#160;            <span class="keywordflow">if</span> (lpszMsg) {</div>
<div class="line"><a name="l01157"></a><span class="lineno"> 1157</span>&#160;                <span class="keywordflow">if</span> (NT_SUCCESS(<a class="code" href="a00362.html#af86a9b04196ca170fc6b6e4b4e6a5dbc">NtUserSetInformationThread</a>(NtCurrentThread(),</div>
<div class="line"><a name="l01158"></a><span class="lineno"> 1158</span>&#160;                        UserThreadUseDesktop, &amp;pcsrt-&gt;ThreadHandle, <span class="keyword">sizeof</span>(HANDLE)))) {</div>
<div class="line"><a name="l01159"></a><span class="lineno"> 1159</span>&#160;                    HANDLE hNull = NULL;</div>
<div class="line"><a name="l01160"></a><span class="lineno"> 1160</span>&#160; </div>
<div class="line"><a name="l01161"></a><span class="lineno"> 1161</span>&#160;                    <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01162"></a><span class="lineno"> 1162</span>&#160;                    MessageBoxEx(NULL, lpszMsg, NULL,</div>
<div class="line"><a name="l01163"></a><span class="lineno"> 1163</span>&#160;                                    MB_OK | MB_SETFOREGROUND, 0);</div>
<div class="line"><a name="l01164"></a><span class="lineno"> 1164</span>&#160;                    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l01165"></a><span class="lineno"> 1165</span>&#160;                    <a class="code" href="a00362.html#af86a9b04196ca170fc6b6e4b4e6a5dbc">NtUserSetInformationThread</a>(NtCurrentThread(), UserThreadUseDesktop,</div>
<div class="line"><a name="l01166"></a><span class="lineno"> 1166</span>&#160;                            &amp;hNull, <span class="keyword">sizeof</span>(HANDLE));</div>
<div class="line"><a name="l01167"></a><span class="lineno"> 1167</span>&#160;                }</div>
<div class="line"><a name="l01168"></a><span class="lineno"> 1168</span>&#160;                LocalFree(lpszMsg);</div>
<div class="line"><a name="l01169"></a><span class="lineno"> 1169</span>&#160;            }</div>
<div class="line"><a name="l01170"></a><span class="lineno"> 1170</span>&#160;        } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01171"></a><span class="lineno"> 1171</span>&#160;            pcsrtKill-&gt;Process-&gt;Flags |= CSR_PROCESS_TERMINATED;</div>
<div class="line"><a name="l01172"></a><span class="lineno"> 1172</span>&#160;        }</div>
<div class="line"><a name="l01173"></a><span class="lineno"> 1173</span>&#160;    }</div>
<div class="line"><a name="l01174"></a><span class="lineno"> 1174</span>&#160;    CsrDereferenceThread(pcsrtKill);</div>
<div class="line"><a name="l01175"></a><span class="lineno"> 1175</span>&#160; </div>
<div class="line"><a name="l01176"></a><span class="lineno"> 1176</span>&#160;    <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01177"></a><span class="lineno"> 1177</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a03239_source.html#l00036">CMDEND_APPSAYSNOTOK</a>, <a class="el" href="a03239_source.html#l00038">CMDEND_USERSAYSCANCEL</a>, <a class="el" href="a00563_source.html#l00175">DWORD</a>, <a class="el" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit()</a>, <a class="el" href="a00263_source.html#l00211">GetWindowThreadProcessId()</a>, <a class="el" href="a03257_source.html#l00324">hModuleWin</a>, <a class="el" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit()</a>, <a class="el" href="a03239_source.html#l00634">MySendEndSessionMessages()</a>, <a class="el" href="a03614_source.html#l06050">NtUserSetInformationThread()</a>, <a class="el" href="a00356_source.html#l00471">PostMessage()</a> , 以及 <a class="el" href="a03239_source.html#l01188">WowExitTask()</a>.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l01405">SrvEndTask()</a>.</p>

</div>
</div>
<a id="aa4be6119fd72c33b7a4a76bf7a72762c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aa4be6119fd72c33b7a4a76bf7a72762c">&#9670;&nbsp;</a></span>_ExitWindowsEx()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">NTSTATUS _ExitWindowsEx </td>
          <td>(</td>
          <td class="paramtype">PCSR_THREAD&#160;</td>
          <td class="paramname"><em>pcsrt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="a03608.html#afd1a0e78d1f88954d93e48ab3821781f">UINT</a>&#160;</td>
          <td class="paramname"><em>dwFlags</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>&#160;</td>
          <td class="paramname"><em>dwReserved</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00068">68</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l00072"></a><span class="lineno">   72</span>&#160;{</div>
<div class="line"><a name="l00073"></a><span class="lineno">   73</span>&#160;    BOOL fDoEndSession = FALSE;</div>
<div class="line"><a name="l00074"></a><span class="lineno">   74</span>&#160;    LUID luidCaller;</div>
<div class="line"><a name="l00075"></a><span class="lineno">   75</span>&#160;    NTSTATUS Status = STATUS_SUCCESS;</div>
<div class="line"><a name="l00076"></a><span class="lineno">   76</span>&#160;    UNREFERENCED_PARAMETER(dwReserved);</div>
<div class="line"><a name="l00077"></a><span class="lineno">   77</span>&#160; </div>
<div class="line"><a name="l00078"></a><span class="lineno">   78</span>&#160;    <span class="keywordflow">if</span> ((dwFlags &amp; EWX_REBOOT) || (dwFlags &amp; EWX_POWEROFF)) {</div>
<div class="line"><a name="l00079"></a><span class="lineno">   79</span>&#160;        dwFlags |= EWX_SHUTDOWN;</div>
<div class="line"><a name="l00080"></a><span class="lineno">   80</span>&#160;    }</div>
<div class="line"><a name="l00081"></a><span class="lineno">   81</span>&#160; </div>
<div class="line"><a name="l00082"></a><span class="lineno">   82</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00083"></a><span class="lineno">   83</span>&#160;<span class="comment">     * Find out the callers sid. Only want to shutdown processes in the</span></div>
<div class="line"><a name="l00084"></a><span class="lineno">   84</span>&#160;<span class="comment">     * callers sid.</span></div>
<div class="line"><a name="l00085"></a><span class="lineno">   85</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00086"></a><span class="lineno">   86</span>&#160;    <span class="keywordflow">if</span> (!CsrImpersonateClient(NULL)) {</div>
<div class="line"><a name="l00087"></a><span class="lineno">   87</span>&#160;        <span class="keywordflow">return</span> STATUS_BAD_IMPERSONATION_LEVEL;</div>
<div class="line"><a name="l00088"></a><span class="lineno">   88</span>&#160;    }</div>
<div class="line"><a name="l00089"></a><span class="lineno">   89</span>&#160; </div>
<div class="line"><a name="l00090"></a><span class="lineno">   90</span>&#160;    Status = CsrGetProcessLuid(NULL, &amp;luidCaller);</div>
<div class="line"><a name="l00091"></a><span class="lineno">   91</span>&#160; </div>
<div class="line"><a name="l00092"></a><span class="lineno">   92</span>&#160;    <span class="keywordflow">if</span> (!NT_SUCCESS(Status)) {</div>
<div class="line"><a name="l00093"></a><span class="lineno">   93</span>&#160;        CsrRevertToSelf();</div>
<div class="line"><a name="l00094"></a><span class="lineno">   94</span>&#160;        <span class="keywordflow">return</span> Status;</div>
<div class="line"><a name="l00095"></a><span class="lineno">   95</span>&#160;    }</div>
<div class="line"><a name="l00096"></a><span class="lineno">   96</span>&#160; </div>
<div class="line"><a name="l00097"></a><span class="lineno">   97</span>&#160;    <span class="keywordflow">try</span> {</div>
<div class="line"><a name="l00098"></a><span class="lineno">   98</span>&#160; </div>
<div class="line"><a name="l00099"></a><span class="lineno">   99</span>&#160;        <span class="keywordflow">while</span> (1) {</div>
<div class="line"><a name="l00100"></a><span class="lineno">  100</span>&#160;            LARGE_INTEGER li;</div>
<div class="line"><a name="l00101"></a><span class="lineno">  101</span>&#160; </div>
<div class="line"><a name="l00102"></a><span class="lineno">  102</span>&#160;            <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00103"></a><span class="lineno">  103</span>&#160;            Status = <a class="code" href="a00362.html#af86a9b04196ca170fc6b6e4b4e6a5dbc">NtUserSetInformationThread</a>(</div>
<div class="line"><a name="l00104"></a><span class="lineno">  104</span>&#160;                    pcsrt-&gt;ThreadHandle,</div>
<div class="line"><a name="l00105"></a><span class="lineno">  105</span>&#160;                    UserThreadInitiateShutdown,</div>
<div class="line"><a name="l00106"></a><span class="lineno">  106</span>&#160;                    &amp;dwFlags, <span class="keyword">sizeof</span>(dwFlags));</div>
<div class="line"><a name="l00107"></a><span class="lineno">  107</span>&#160;            <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00108"></a><span class="lineno">  108</span>&#160;            <span class="keywordflow">switch</span> (Status) {</div>
<div class="line"><a name="l00109"></a><span class="lineno">  109</span>&#160;            <span class="keywordflow">case</span> STATUS_PENDING:</div>
<div class="line"><a name="l00110"></a><span class="lineno">  110</span>&#160; </div>
<div class="line"><a name="l00111"></a><span class="lineno">  111</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l00112"></a><span class="lineno">  112</span>&#160;<span class="comment">                 * The logoff/shutdown is in progress and nothing</span></div>
<div class="line"><a name="l00113"></a><span class="lineno">  113</span>&#160;<span class="comment">                 * more needs to be done.</span></div>
<div class="line"><a name="l00114"></a><span class="lineno">  114</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l00115"></a><span class="lineno">  115</span>&#160;                <span class="keywordflow">goto</span> fastexit;</div>
<div class="line"><a name="l00116"></a><span class="lineno">  116</span>&#160; </div>
<div class="line"><a name="l00117"></a><span class="lineno">  117</span>&#160;            <span class="keywordflow">case</span> STATUS_RETRY:</div>
<div class="line"><a name="l00118"></a><span class="lineno">  118</span>&#160; </div>
<div class="line"><a name="l00119"></a><span class="lineno">  119</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l00120"></a><span class="lineno">  120</span>&#160;<span class="comment">                 * Another logoff/shutdown is in progress and we need</span></div>
<div class="line"><a name="l00121"></a><span class="lineno">  121</span>&#160;<span class="comment">                 * to cancel it so we can do an override.</span></div>
<div class="line"><a name="l00122"></a><span class="lineno">  122</span>&#160;<span class="comment">                 *</span></div>
<div class="line"><a name="l00123"></a><span class="lineno">  123</span>&#160;<span class="comment">                 * if someone else is trying to cancel shutdown, exit</span></div>
<div class="line"><a name="l00124"></a><span class="lineno">  124</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l00125"></a><span class="lineno">  125</span>&#160;                li.QuadPart  = 0;</div>
<div class="line"><a name="l00126"></a><span class="lineno">  126</span>&#160;                <span class="keywordflow">if</span> (NtWaitForSingleObject(<a class="code" href="a03260.html#a7734daf887ee2ecb9d7b91c68e67ba3a">heventCancel</a>, FALSE, &amp;li) == 0) {</div>
<div class="line"><a name="l00127"></a><span class="lineno">  127</span>&#160;                    Status = STATUS_PENDING;</div>
<div class="line"><a name="l00128"></a><span class="lineno">  128</span>&#160;                    <span class="keywordflow">goto</span> fastexit;</div>
<div class="line"><a name="l00129"></a><span class="lineno">  129</span>&#160;                }</div>
<div class="line"><a name="l00130"></a><span class="lineno">  130</span>&#160; </div>
<div class="line"><a name="l00131"></a><span class="lineno">  131</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l00132"></a><span class="lineno">  132</span>&#160;<span class="comment">                 * Cancel the old shutdown</span></div>
<div class="line"><a name="l00133"></a><span class="lineno">  133</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l00134"></a><span class="lineno">  134</span>&#160;                NtClearEvent(<a class="code" href="a03260.html#a7eb2ff513af1241501c8b9e72102328f">heventCancelled</a>);</div>
<div class="line"><a name="l00135"></a><span class="lineno">  135</span>&#160;                NtSetEvent(<a class="code" href="a03260.html#a7734daf887ee2ecb9d7b91c68e67ba3a">heventCancel</a>, NULL);</div>
<div class="line"><a name="l00136"></a><span class="lineno">  136</span>&#160; </div>
<div class="line"><a name="l00137"></a><span class="lineno">  137</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l00138"></a><span class="lineno">  138</span>&#160;<span class="comment">                 * Wait for the other guy to be cancelled</span></div>
<div class="line"><a name="l00139"></a><span class="lineno">  139</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l00140"></a><span class="lineno">  140</span>&#160;                <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00141"></a><span class="lineno">  141</span>&#160;                NtWaitForSingleObject(<a class="code" href="a03260.html#a7eb2ff513af1241501c8b9e72102328f">heventCancelled</a>, FALSE, NULL);</div>
<div class="line"><a name="l00142"></a><span class="lineno">  142</span>&#160;                <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00143"></a><span class="lineno">  143</span>&#160; </div>
<div class="line"><a name="l00144"></a><span class="lineno">  144</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l00145"></a><span class="lineno">  145</span>&#160;<span class="comment">                 * This signals that we are no longer trying to cancel a</span></div>
<div class="line"><a name="l00146"></a><span class="lineno">  146</span>&#160;<span class="comment">                 * shutdown</span></div>
<div class="line"><a name="l00147"></a><span class="lineno">  147</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l00148"></a><span class="lineno">  148</span>&#160;                NtClearEvent(<a class="code" href="a03260.html#a7734daf887ee2ecb9d7b91c68e67ba3a">heventCancel</a>);</div>
<div class="line"><a name="l00149"></a><span class="lineno">  149</span>&#160;                <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00150"></a><span class="lineno">  150</span>&#160; </div>
<div class="line"><a name="l00151"></a><span class="lineno">  151</span>&#160;            <span class="keywordflow">case</span> STATUS_CANT_WAIT:</div>
<div class="line"><a name="l00152"></a><span class="lineno">  152</span>&#160; </div>
<div class="line"><a name="l00153"></a><span class="lineno">  153</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l00154"></a><span class="lineno">  154</span>&#160;<span class="comment">                 * There is no notify window and the calling thread has</span></div>
<div class="line"><a name="l00155"></a><span class="lineno">  155</span>&#160;<span class="comment">                 * windows that prevent this request from succeeding.</span></div>
<div class="line"><a name="l00156"></a><span class="lineno">  156</span>&#160;<span class="comment">                 * The client handles this by starting another thread</span></div>
<div class="line"><a name="l00157"></a><span class="lineno">  157</span>&#160;<span class="comment">                 * to recall ExitWindowsEx.</span></div>
<div class="line"><a name="l00158"></a><span class="lineno">  158</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l00159"></a><span class="lineno">  159</span>&#160;                <span class="keywordflow">goto</span> fastexit;</div>
<div class="line"><a name="l00160"></a><span class="lineno">  160</span>&#160; </div>
<div class="line"><a name="l00161"></a><span class="lineno">  161</span>&#160;            <span class="keywordflow">default</span>:</div>
<div class="line"><a name="l00162"></a><span class="lineno">  162</span>&#160;                <span class="keywordflow">if</span> (!NT_SUCCESS(Status))</div>
<div class="line"><a name="l00163"></a><span class="lineno">  163</span>&#160;                    <span class="keywordflow">goto</span> fastexit;</div>
<div class="line"><a name="l00164"></a><span class="lineno">  164</span>&#160;            }</div>
<div class="line"><a name="l00165"></a><span class="lineno">  165</span>&#160;            <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00166"></a><span class="lineno">  166</span>&#160;        }</div>
<div class="line"><a name="l00167"></a><span class="lineno">  167</span>&#160; </div>
<div class="line"><a name="l00168"></a><span class="lineno">  168</span>&#160;        <a class="code" href="a03239.html#a76588185d43cb97e9647d0765c2d7c7b">gdwFlags</a> = dwFlags;</div>
<div class="line"><a name="l00169"></a><span class="lineno">  169</span>&#160;        <a class="code" href="a03257.html#a8cebae587f0400eeadc0969475554a1b">dwThreadEndSession</a> = (<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>)pcsrt-&gt;ClientId.UniqueThread;</div>
<div class="line"><a name="l00170"></a><span class="lineno">  170</span>&#160;        fDoEndSession = TRUE;</div>
<div class="line"><a name="l00171"></a><span class="lineno">  171</span>&#160; </div>
<div class="line"><a name="l00172"></a><span class="lineno">  172</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00173"></a><span class="lineno">  173</span>&#160;<span class="comment">         * Sometimes the console calls the dialog box when not in shutdown</span></div>
<div class="line"><a name="l00174"></a><span class="lineno">  174</span>&#160;<span class="comment">         * if now is one of those times cancel the dialog box.</span></div>
<div class="line"><a name="l00175"></a><span class="lineno">  175</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00176"></a><span class="lineno">  176</span>&#160;        while (<a class="code" href="a03239.html#a03f0b7bae20eca44bfb023829e957e3b">gcInternalDoEndTaskDialog</a> &gt; 0) {</div>
<div class="line"><a name="l00177"></a><span class="lineno">  177</span>&#160;            LARGE_INTEGER li;</div>
<div class="line"><a name="l00178"></a><span class="lineno">  178</span>&#160; </div>
<div class="line"><a name="l00179"></a><span class="lineno">  179</span>&#160;            NtPulseEvent(<a class="code" href="a03260.html#a7734daf887ee2ecb9d7b91c68e67ba3a">heventCancel</a>, NULL);</div>
<div class="line"><a name="l00180"></a><span class="lineno">  180</span>&#160; </div>
<div class="line"><a name="l00181"></a><span class="lineno">  181</span>&#160;            <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00182"></a><span class="lineno">  182</span>&#160;            li.QuadPart = (LONGLONG)-10000 * CMSSLEEP;</div>
<div class="line"><a name="l00183"></a><span class="lineno">  183</span>&#160;            NtDelayExecution(FALSE, &amp;li);</div>
<div class="line"><a name="l00184"></a><span class="lineno">  184</span>&#160;            <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00185"></a><span class="lineno">  185</span>&#160;        }</div>
<div class="line"><a name="l00186"></a><span class="lineno">  186</span>&#160; </div>
<div class="line"><a name="l00187"></a><span class="lineno">  187</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00188"></a><span class="lineno">  188</span>&#160;<span class="comment">         * Call csr to loop through the processes shutting them down.</span></div>
<div class="line"><a name="l00189"></a><span class="lineno">  189</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00190"></a><span class="lineno">  190</span>&#160;        <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00191"></a><span class="lineno">  191</span>&#160;        Status = CsrShutdownProcesses(&amp;luidCaller, dwFlags);</div>
<div class="line"><a name="l00192"></a><span class="lineno">  192</span>&#160; </div>
<div class="line"><a name="l00193"></a><span class="lineno">  193</span>&#160;        <a class="code" href="a00362.html#af86a9b04196ca170fc6b6e4b4e6a5dbc">NtUserSetInformationThread</a>(</div>
<div class="line"><a name="l00194"></a><span class="lineno">  194</span>&#160;                pcsrt-&gt;ThreadHandle,</div>
<div class="line"><a name="l00195"></a><span class="lineno">  195</span>&#160;                UserThreadEndShutdown, &amp;Status, <span class="keyword">sizeof</span>(Status));</div>
<div class="line"><a name="l00196"></a><span class="lineno">  196</span>&#160;        <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00197"></a><span class="lineno">  197</span>&#160;fastexit:;</div>
<div class="line"><a name="l00198"></a><span class="lineno">  198</span>&#160;    } <span class="keywordflow">finally</span> {</div>
<div class="line"><a name="l00199"></a><span class="lineno">  199</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00200"></a><span class="lineno">  200</span>&#160;<span class="comment">         * Only turn off dwThreadEndSession if this is the</span></div>
<div class="line"><a name="l00201"></a><span class="lineno">  201</span>&#160;<span class="comment">         * thread doing shutdown.</span></div>
<div class="line"><a name="l00202"></a><span class="lineno">  202</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00203"></a><span class="lineno">  203</span>&#160;        <span class="keywordflow">if</span> (fDoEndSession) {</div>
<div class="line"><a name="l00204"></a><span class="lineno">  204</span>&#160;            <a class="code" href="a03257.html#a8cebae587f0400eeadc0969475554a1b">dwThreadEndSession</a> = 0;</div>
<div class="line"><a name="l00205"></a><span class="lineno">  205</span>&#160;            NtSetEvent(<a class="code" href="a03260.html#a7eb2ff513af1241501c8b9e72102328f">heventCancelled</a>, NULL);</div>
<div class="line"><a name="l00206"></a><span class="lineno">  206</span>&#160;        }</div>
<div class="line"><a name="l00207"></a><span class="lineno">  207</span>&#160;    }</div>
<div class="line"><a name="l00208"></a><span class="lineno">  208</span>&#160; </div>
<div class="line"><a name="l00209"></a><span class="lineno">  209</span>&#160;    CsrRevertToSelf();</div>
<div class="line"><a name="l00210"></a><span class="lineno">  210</span>&#160; </div>
<div class="line"><a name="l00211"></a><span class="lineno">  211</span>&#160;    <span class="keywordflow">return</span> Status;</div>
<div class="line"><a name="l00212"></a><span class="lineno">  212</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a00563_source.html#l00175">DWORD</a>, <a class="el" href="a03257_source.html#l00295">dwThreadEndSession</a>, <a class="el" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit()</a>, <a class="el" href="a03239_source.html#l00066">gcInternalDoEndTaskDialog</a>, <a class="el" href="a03239_source.html#l00065">gdwFlags</a>, <a class="el" href="a03260_source.html#l00027">heventCancel</a>, <a class="el" href="a03260_source.html#l00028">heventCancelled</a>, <a class="el" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit()</a> , 以及 <a class="el" href="a03614_source.html#l06050">NtUserSetInformationThread()</a>.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l01392">SrvExitWindowsEx()</a>.</p>

</div>
</div>
<a id="ad251c3353b8caac862bb30255af684fa"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad251c3353b8caac862bb30255af684fa">&#9670;&nbsp;</a></span>BoostHardError()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">BOOL BoostHardError </td>
          <td>(</td>
          <td class="paramtype"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>&#160;</td>
          <td class="paramname"><em>dwProcessId</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">BOOL&#160;</td>
          <td class="paramname"><em>fForce</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a00947_source.html">harderr.c</a> 第 <a class="el" href="a00947_source.html#l01464">1464</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;{</div>
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;    HDESK hdeskSave;</div>
<div class="line"><a name="l01469"></a><span class="lineno"> 1469</span>&#160;    <a class="code" href="a03037.html">PHARDERRORINFO</a> phi, *pphi;</div>
<div class="line"><a name="l01470"></a><span class="lineno"> 1470</span>&#160;    BOOL fHasError = FALSE;</div>
<div class="line"><a name="l01471"></a><span class="lineno"> 1471</span>&#160;    BOOL fWasActive = FALSE;</div>
<div class="line"><a name="l01472"></a><span class="lineno"> 1472</span>&#160;    BOOL fWasInCrit;</div>
<div class="line"><a name="l01473"></a><span class="lineno"> 1473</span>&#160;    HANDLE hThreadId;</div>
<div class="line"><a name="l01474"></a><span class="lineno"> 1474</span>&#160;    <span class="keywordtype">int</span> cTries = 0;</div>
<div class="line"><a name="l01475"></a><span class="lineno"> 1475</span>&#160; </div>
<div class="line"><a name="l01476"></a><span class="lineno"> 1476</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="a03260.html#a2e38c8fb530756e6c474c428087414ac">gphiList</a> == NULL)</div>
<div class="line"><a name="l01477"></a><span class="lineno"> 1477</span>&#160;        <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l01478"></a><span class="lineno"> 1478</span>&#160; </div>
<div class="line"><a name="l01479"></a><span class="lineno"> 1479</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01480"></a><span class="lineno"> 1480</span>&#160;<span class="comment">     * Save the state of the critical section.  If we are in it,</span></div>
<div class="line"><a name="l01481"></a><span class="lineno"> 1481</span>&#160;<span class="comment">     * we must leave it prior to calling GetThreadDesktop.</span></div>
<div class="line"><a name="l01482"></a><span class="lineno"> 1482</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;    hThreadId = NtCurrentTeb()-&gt;ClientId.UniqueThread;</div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;    fWasInCrit = (<a class="code" href="a03260.html#a4438bfeedbb0e0f04b40323c4f2dd016">gcsUserSrv</a>.OwningThread == hThreadId);</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;    <span class="keywordflow">if</span> (fWasInCrit)</div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;        <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160; </div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160;<span class="comment">     * Save current desktop in case we need to change desktops</span></div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;<span class="comment">     * to activate windows.</span></div>
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;    hdeskSave = <a class="code" href="a00074.html#ac16585e37e0ffa0730da4435597e4f05">GetThreadDesktop</a>(GetCurrentThreadId());</div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160; </div>
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160; </div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;    <span class="keywordflow">for</span> (pphi = &amp;<a class="code" href="a03260.html#a2e38c8fb530756e6c474c428087414ac">gphiList</a>; *pphi != NULL; ) {</div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;        <span class="keywordflow">if</span> ((*pphi)-&gt;pthread != NULL &amp;&amp;</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;                (*pphi)-&gt;pthread-&gt;ClientId.UniqueProcess == (HANDLE)dwProcessId) {</div>
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160; </div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160;<span class="comment">             * Found a hard error message.</span></div>
<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;            fHasError = TRUE;</div>
<div class="line"><a name="l01504"></a><span class="lineno"> 1504</span>&#160;            <span class="keywordflow">if</span> (fForce) {</div>
<div class="line"><a name="l01505"></a><span class="lineno"> 1505</span>&#160; </div>
<div class="line"><a name="l01506"></a><span class="lineno"> 1506</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l01507"></a><span class="lineno"> 1507</span>&#160;<span class="comment">                 * Unlink it from the list.</span></div>
<div class="line"><a name="l01508"></a><span class="lineno"> 1508</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l01509"></a><span class="lineno"> 1509</span>&#160;                phi = *pphi;</div>
<div class="line"><a name="l01510"></a><span class="lineno"> 1510</span>&#160;                *pphi = phi-&gt;<a class="code" href="a03037.html#aa0d1e08a97071ddf68420bd8d7ec5a39">phiNext</a>;</div>
<div class="line"><a name="l01511"></a><span class="lineno"> 1511</span>&#160;                fWasActive = (phi-&gt;<a class="code" href="a03037.html#aa0d1e08a97071ddf68420bd8d7ec5a39">phiNext</a> == NULL);</div>
<div class="line"><a name="l01512"></a><span class="lineno"> 1512</span>&#160; </div>
<div class="line"><a name="l01513"></a><span class="lineno"> 1513</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l01514"></a><span class="lineno"> 1514</span>&#160;<span class="comment">                 * Acknowledge the error as not handled.</span></div>
<div class="line"><a name="l01515"></a><span class="lineno"> 1515</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l01516"></a><span class="lineno"> 1516</span>&#160;                phi-&gt;<a class="code" href="a03037.html#a64d04007b925ebd160829e7c3371524b">pmsg</a>-&gt;Response = ResponseNotHandled;</div>
<div class="line"><a name="l01517"></a><span class="lineno"> 1517</span>&#160;                <span class="keywordflow">if</span> (phi-&gt;<a class="code" href="a03037.html#aebf5ac041d62ab0c360c51eaa0cdd3a2">hEventHardError</a> == NULL) {</div>
<div class="line"><a name="l01518"></a><span class="lineno"> 1518</span>&#160;                    NtReplyPort(phi-&gt;<a class="code" href="a03037.html#acd19c56da3900c4a6f8b1e5e4fbfb71b">pthread</a>-&gt;Process-&gt;ClientPort,</div>
<div class="line"><a name="l01519"></a><span class="lineno"> 1519</span>&#160;                            (PPORT_MESSAGE)phi-&gt;<a class="code" href="a03037.html#a64d04007b925ebd160829e7c3371524b">pmsg</a>);</div>
<div class="line"><a name="l01520"></a><span class="lineno"> 1520</span>&#160;                    <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01521"></a><span class="lineno"> 1521</span>&#160;                    CsrDereferenceThread(phi-&gt;<a class="code" href="a03037.html#acd19c56da3900c4a6f8b1e5e4fbfb71b">pthread</a>);</div>
<div class="line"><a name="l01522"></a><span class="lineno"> 1522</span>&#160;                    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l01523"></a><span class="lineno"> 1523</span>&#160;                    LocalFree(phi-&gt;<a class="code" href="a03037.html#a64d04007b925ebd160829e7c3371524b">pmsg</a>);</div>
<div class="line"><a name="l01524"></a><span class="lineno"> 1524</span>&#160;                    <span class="comment">/*</span></div>
<div class="line"><a name="l01525"></a><span class="lineno"> 1525</span>&#160;<span class="comment">                     * The list might have changed while we were outside the</span></div>
<div class="line"><a name="l01526"></a><span class="lineno"> 1526</span>&#160;<span class="comment">                     * critical section, so start over.</span></div>
<div class="line"><a name="l01527"></a><span class="lineno"> 1527</span>&#160;<span class="comment">                     */</span></div>
<div class="line"><a name="l01528"></a><span class="lineno"> 1528</span>&#160;                    pphi = &amp;<a class="code" href="a03260.html#a2e38c8fb530756e6c474c428087414ac">gphiList</a>;</div>
<div class="line"><a name="l01529"></a><span class="lineno"> 1529</span>&#160;                    cTries++;</div>
<div class="line"><a name="l01530"></a><span class="lineno"> 1530</span>&#160;                } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01531"></a><span class="lineno"> 1531</span>&#160;                    NtSetEvent(phi-&gt;<a class="code" href="a03037.html#aebf5ac041d62ab0c360c51eaa0cdd3a2">hEventHardError</a>, NULL);</div>
<div class="line"><a name="l01532"></a><span class="lineno"> 1532</span>&#160;                }</div>
<div class="line"><a name="l01533"></a><span class="lineno"> 1533</span>&#160;                LocalFree(phi);</div>
<div class="line"><a name="l01534"></a><span class="lineno"> 1534</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l01535"></a><span class="lineno"> 1535</span>&#160;<span class="comment">                 * Bail out if we&#39;ve already started over a bunch of times.</span></div>
<div class="line"><a name="l01536"></a><span class="lineno"> 1536</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l01537"></a><span class="lineno"> 1537</span>&#160;                <span class="keywordflow">if</span> (cTries &gt; 16) {</div>
<div class="line"><a name="l01538"></a><span class="lineno"> 1538</span>&#160;                    KdPrint((<span class="stringliteral">&quot;BoostHardError exceeded max loop count\n&quot;</span>));</div>
<div class="line"><a name="l01539"></a><span class="lineno"> 1539</span>&#160;                    <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01540"></a><span class="lineno"> 1540</span>&#160;                }</div>
<div class="line"><a name="l01541"></a><span class="lineno"> 1541</span>&#160;            } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01542"></a><span class="lineno"> 1542</span>&#160; </div>
<div class="line"><a name="l01543"></a><span class="lineno"> 1543</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l01544"></a><span class="lineno"> 1544</span>&#160;<span class="comment">                 * If this is the last one in the list, we don&#39;t</span></div>
<div class="line"><a name="l01545"></a><span class="lineno"> 1545</span>&#160;<span class="comment">                 * need to do anything to bring it up, just</span></div>
<div class="line"><a name="l01546"></a><span class="lineno"> 1546</span>&#160;<span class="comment">                 * need to activate the popup.</span></div>
<div class="line"><a name="l01547"></a><span class="lineno"> 1547</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l01548"></a><span class="lineno"> 1548</span>&#160;                <span class="keywordflow">if</span> ((*pphi)-&gt;phiNext == NULL) {</div>
<div class="line"><a name="l01549"></a><span class="lineno"> 1549</span>&#160;                    HWND hwndError = NULL;</div>
<div class="line"><a name="l01550"></a><span class="lineno"> 1550</span>&#160; </div>
<div class="line"><a name="l01551"></a><span class="lineno"> 1551</span>&#160;                    <span class="comment">/*</span></div>
<div class="line"><a name="l01552"></a><span class="lineno"> 1552</span>&#160;<span class="comment">                     * Make the hard error foreground.</span></div>
<div class="line"><a name="l01553"></a><span class="lineno"> 1553</span>&#160;<span class="comment">                     */</span></div>
<div class="line"><a name="l01554"></a><span class="lineno"> 1554</span>&#160;                    <a class="code" href="a00017.html#a24afbf4ddb86fdedeb15a6b679902e71">EnumThreadWindows</a>((<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>)hThreadId,</div>
<div class="line"><a name="l01555"></a><span class="lineno"> 1555</span>&#160;                            <a class="code" href="a00947.html#aef87df1174fdc7e8f3988875e8288c18">WindowEnumProc</a>, (LPARAM)&amp;hwndError);</div>
<div class="line"><a name="l01556"></a><span class="lineno"> 1556</span>&#160;                    <span class="keywordflow">if</span> (hwndError != NULL &amp;&amp;</div>
<div class="line"><a name="l01557"></a><span class="lineno"> 1557</span>&#160;                            <a class="code" href="a00362.html#a59e7c7ee34e45834b8af2b59508f5e95">NtUserHardErrorControl</a>(HardErrorAttachNoQueue, NULL)) {</div>
<div class="line"><a name="l01558"></a><span class="lineno"> 1558</span>&#160; </div>
<div class="line"><a name="l01559"></a><span class="lineno"> 1559</span>&#160;                        <a class="code" href="a00026.html#a0427963300ccb73271752f9310fab5c8">SetForegroundWindow</a>(hwndError);</div>
<div class="line"><a name="l01560"></a><span class="lineno"> 1560</span>&#160; </div>
<div class="line"><a name="l01561"></a><span class="lineno"> 1561</span>&#160;                        <span class="comment">/*</span></div>
<div class="line"><a name="l01562"></a><span class="lineno"> 1562</span>&#160;<span class="comment">                         * Release the desktop that was used.</span></div>
<div class="line"><a name="l01563"></a><span class="lineno"> 1563</span>&#160;<span class="comment">                         */</span></div>
<div class="line"><a name="l01564"></a><span class="lineno"> 1564</span>&#160;                        <a class="code" href="a00362.html#a59e7c7ee34e45834b8af2b59508f5e95">NtUserHardErrorControl</a>(HardErrorDetachNoQueue, hdeskSave);</div>
<div class="line"><a name="l01565"></a><span class="lineno"> 1565</span>&#160;                    }</div>
<div class="line"><a name="l01566"></a><span class="lineno"> 1566</span>&#160;                    <span class="keywordflow">if</span> (!fWasInCrit)</div>
<div class="line"><a name="l01567"></a><span class="lineno"> 1567</span>&#160;                        <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01568"></a><span class="lineno"> 1568</span>&#160;                    <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01569"></a><span class="lineno"> 1569</span>&#160;                }</div>
<div class="line"><a name="l01570"></a><span class="lineno"> 1570</span>&#160; </div>
<div class="line"><a name="l01571"></a><span class="lineno"> 1571</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l01572"></a><span class="lineno"> 1572</span>&#160;<span class="comment">                 * Unlink it from the list.</span></div>
<div class="line"><a name="l01573"></a><span class="lineno"> 1573</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l01574"></a><span class="lineno"> 1574</span>&#160;                phi = *pphi;</div>
<div class="line"><a name="l01575"></a><span class="lineno"> 1575</span>&#160;                *pphi = phi-&gt;<a class="code" href="a03037.html#aa0d1e08a97071ddf68420bd8d7ec5a39">phiNext</a>;</div>
<div class="line"><a name="l01576"></a><span class="lineno"> 1576</span>&#160; </div>
<div class="line"><a name="l01577"></a><span class="lineno"> 1577</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l01578"></a><span class="lineno"> 1578</span>&#160;<span class="comment">                 * Put it on the tail of the list so it will come up first.</span></div>
<div class="line"><a name="l01579"></a><span class="lineno"> 1579</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l01580"></a><span class="lineno"> 1580</span>&#160;                <span class="keywordflow">while</span> (*pphi != NULL)</div>
<div class="line"><a name="l01581"></a><span class="lineno"> 1581</span>&#160;                    pphi = &amp;(*pphi)-&gt;<a class="code" href="a03037.html#aa0d1e08a97071ddf68420bd8d7ec5a39">phiNext</a>;</div>
<div class="line"><a name="l01582"></a><span class="lineno"> 1582</span>&#160;                *pphi = phi;</div>
<div class="line"><a name="l01583"></a><span class="lineno"> 1583</span>&#160;                phi-&gt;<a class="code" href="a03037.html#aa0d1e08a97071ddf68420bd8d7ec5a39">phiNext</a> = NULL;</div>
<div class="line"><a name="l01584"></a><span class="lineno"> 1584</span>&#160;                <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01585"></a><span class="lineno"> 1585</span>&#160;            }</div>
<div class="line"><a name="l01586"></a><span class="lineno"> 1586</span>&#160;        } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01587"></a><span class="lineno"> 1587</span>&#160; </div>
<div class="line"><a name="l01588"></a><span class="lineno"> 1588</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l01589"></a><span class="lineno"> 1589</span>&#160;<span class="comment">             * Step to the next error in the list.</span></div>
<div class="line"><a name="l01590"></a><span class="lineno"> 1590</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l01591"></a><span class="lineno"> 1591</span>&#160;            pphi = &amp;(*pphi)-&gt;<a class="code" href="a03037.html#aa0d1e08a97071ddf68420bd8d7ec5a39">phiNext</a>;</div>
<div class="line"><a name="l01592"></a><span class="lineno"> 1592</span>&#160;        }</div>
<div class="line"><a name="l01593"></a><span class="lineno"> 1593</span>&#160;    }</div>
<div class="line"><a name="l01594"></a><span class="lineno"> 1594</span>&#160; </div>
<div class="line"><a name="l01595"></a><span class="lineno"> 1595</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01596"></a><span class="lineno"> 1596</span>&#160;<span class="comment">     * If the diplayed error was cleared and there is still</span></div>
<div class="line"><a name="l01597"></a><span class="lineno"> 1597</span>&#160;<span class="comment">     * a handler thread, restart the popup.</span></div>
<div class="line"><a name="l01598"></a><span class="lineno"> 1598</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01599"></a><span class="lineno"> 1599</span>&#160;    <span class="keywordflow">if</span> (fWasActive &amp;&amp; <a class="code" href="a03260.html#a2d28a753e97e7eae07a42932598cdb7c">gdwHardErrorThreadId</a> != 0) {</div>
<div class="line"><a name="l01600"></a><span class="lineno"> 1600</span>&#160;        <a class="code" href="a03260.html#a65d2845dd8d59d521c009580f0313690">gfHardError</a> = HEF_RESTART;</div>
<div class="line"><a name="l01601"></a><span class="lineno"> 1601</span>&#160;        <a class="code" href="a00356.html#a9975aeae52f4537ddbf083d32e928001">PostThreadMessage</a>(<a class="code" href="a03260.html#a2d28a753e97e7eae07a42932598cdb7c">gdwHardErrorThreadId</a>, WM_QUIT, 0, 0);</div>
<div class="line"><a name="l01602"></a><span class="lineno"> 1602</span>&#160;    }</div>
<div class="line"><a name="l01603"></a><span class="lineno"> 1603</span>&#160; </div>
<div class="line"><a name="l01604"></a><span class="lineno"> 1604</span>&#160;    <span class="keywordflow">if</span> (!fWasInCrit)</div>
<div class="line"><a name="l01605"></a><span class="lineno"> 1605</span>&#160;        <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01606"></a><span class="lineno"> 1606</span>&#160; </div>
<div class="line"><a name="l01607"></a><span class="lineno"> 1607</span>&#160;    <span class="keywordflow">return</span> fHasError;</div>
<div class="line"><a name="l01608"></a><span class="lineno"> 1608</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a00563_source.html#l00175">DWORD</a>, <a class="el" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit()</a>, <a class="el" href="a00017_source.html#l00070">EnumThreadWindows()</a>, <a class="el" href="a03260_source.html#l00025">gcsUserSrv</a>, <a class="el" href="a03260_source.html#l00019">gdwHardErrorThreadId</a>, <a class="el" href="a00074_source.html#l00293">GetThreadDesktop()</a>, <a class="el" href="a03260_source.html#l00023">gfHardError</a>, <a class="el" href="a03260_source.html#l00024">gphiList</a>, <a class="el" href="a00950_source.html#l00092">tagHARDERRORINFO::hEventHardError</a>, <a class="el" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit()</a>, <a class="el" href="a03614_source.html#l00302">NtUserHardErrorControl()</a>, <a class="el" href="a00950_source.html#l00090">tagHARDERRORINFO::phiNext</a>, <a class="el" href="a00950_source.html#l00093">tagHARDERRORINFO::pmsg</a>, <a class="el" href="a00356_source.html#l00534">PostThreadMessage()</a>, <a class="el" href="a00950_source.html#l00091">tagHARDERRORINFO::pthread</a>, <a class="el" href="a00026_source.html#l02960">SetForegroundWindow()</a> , 以及 <a class="el" href="a00947_source.html#l00195">WindowEnumProc()</a>.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l00634">MySendEndSessionMessages()</a> , 以及 <a class="el" href="a03239_source.html#l00224">UserClientShutdown()</a>.</p>

</div>
</div>
<a id="a6e1f93446f792e5b40d9bd6307c4430c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a6e1f93446f792e5b40d9bd6307c4430c">&#9670;&nbsp;</a></span>DoEndTaskDialog()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int DoEndTaskDialog </td>
          <td>(</td>
          <td class="paramtype">WCHAR *&#160;</td>
          <td class="paramname"><em>pszTitle</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">HANDLE&#160;</td>
          <td class="paramname"><em>h</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="a03608.html#afd1a0e78d1f88954d93e48ab3821781f">UINT</a>&#160;</td>
          <td class="paramname"><em>type</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>cSeconds</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l01016">1016</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l01021"></a><span class="lineno"> 1021</span>&#160;{</div>
<div class="line"><a name="l01022"></a><span class="lineno"> 1022</span>&#160;    <span class="keywordtype">int</span> result;</div>
<div class="line"><a name="l01023"></a><span class="lineno"> 1023</span>&#160;    <a class="code" href="a03029.html">ENDDLGPARAMS</a> edp;</div>
<div class="line"><a name="l01024"></a><span class="lineno"> 1024</span>&#160; </div>
<div class="line"><a name="l01025"></a><span class="lineno"> 1025</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="a03260.html#a90d8991b885c92e4fa39f0cd15d98ece">gfAutoEndTask</a>)</div>
<div class="line"><a name="l01026"></a><span class="lineno"> 1026</span>&#160;        <span class="keywordflow">return</span> IDABORT;</div>
<div class="line"><a name="l01027"></a><span class="lineno"> 1027</span>&#160; </div>
<div class="line"><a name="l01028"></a><span class="lineno"> 1028</span>&#160;    edp.<a class="code" href="a03029.html#a31c2497f5c30692c601a804d9c586738">pszTitle</a> = pszTitle;</div>
<div class="line"><a name="l01029"></a><span class="lineno"> 1029</span>&#160;    edp.<a class="code" href="a03029.html#a0182b2e472b8af2291079784ca8926c9">h</a> = h;</div>
<div class="line"><a name="l01030"></a><span class="lineno"> 1030</span>&#160;    edp.<a class="code" href="a03029.html#a82c0d31cf840e5fedfaa52b799063e44">type</a> = <a class="code" href="a00563.html#a7b9b0ae15722c1f5e47208b05166acf3">type</a>;</div>
<div class="line"><a name="l01031"></a><span class="lineno"> 1031</span>&#160;    edp.<a class="code" href="a03029.html#a9c5b0e0659c167ccbc5a5bb9886ce14b">cSeconds</a> = cSeconds;</div>
<div class="line"><a name="l01032"></a><span class="lineno"> 1032</span>&#160; </div>
<div class="line"><a name="l01033"></a><span class="lineno"> 1033</span>&#160;    <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01034"></a><span class="lineno"> 1034</span>&#160;    result = DialogBoxParam(<a class="code" href="a03257.html#a4ae1966258068576cf2be4cc7356924b">hModuleWin</a>,</div>
<div class="line"><a name="l01035"></a><span class="lineno"> 1035</span>&#160;                            MAKEINTRESOURCE(IDD_ENDTASK),</div>
<div class="line"><a name="l01036"></a><span class="lineno"> 1036</span>&#160;                            NULL,</div>
<div class="line"><a name="l01037"></a><span class="lineno"> 1037</span>&#160;                            <a class="code" href="a03239.html#a25eb30750161d9f640fdb5da4da98d28">EndTaskDlgProc</a>,</div>
<div class="line"><a name="l01038"></a><span class="lineno"> 1038</span>&#160;                            (<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>)(&amp;edp));</div>
<div class="line"><a name="l01039"></a><span class="lineno"> 1039</span>&#160;    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l01040"></a><span class="lineno"> 1040</span>&#160; </div>
<div class="line"><a name="l01041"></a><span class="lineno"> 1041</span>&#160;    <span class="keywordflow">return</span> result;</div>
<div class="line"><a name="l01042"></a><span class="lineno"> 1042</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a03239_source.html#l00903">_ENDDLGPARAMS::cSeconds</a>, <a class="el" href="a00563_source.html#l00175">DWORD</a>, <a class="el" href="a03239_source.html#l00916">EndTaskDlgProc()</a>, <a class="el" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit()</a>, <a class="el" href="a03260_source.html#l00022">gfAutoEndTask</a>, <a class="el" href="a03239_source.html#l00901">_ENDDLGPARAMS::h</a>, <a class="el" href="a03257_source.html#l00324">hModuleWin</a>, <a class="el" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit()</a>, <a class="el" href="a03239_source.html#l00900">_ENDDLGPARAMS::pszTitle</a>, <a class="el" href="a00563_source.html#l00068">type</a> , 以及 <a class="el" href="a03239_source.html#l00902">_ENDDLGPARAMS::type</a>.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l01270">InternalDoEndTaskDialog()</a> , 以及 <a class="el" href="a03239_source.html#l00634">MySendEndSessionMessages()</a>.</p>

</div>
</div>
<a id="a25eb30750161d9f640fdb5da4da98d28"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a25eb30750161d9f640fdb5da4da98d28">&#9670;&nbsp;</a></span>EndTaskDlgProc()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">LONG <a class="el" href="a00962.html#a428a91acf2c2439dc1a257708ee1f805">APIENTRY</a> EndTaskDlgProc </td>
          <td>(</td>
          <td class="paramtype">HWND&#160;</td>
          <td class="paramname"><em>hwndDlg</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="a03608.html#afd1a0e78d1f88954d93e48ab3821781f">UINT</a>&#160;</td>
          <td class="paramname"><em>msg</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="a03608.html#afd1a0e78d1f88954d93e48ab3821781f">UINT</a>&#160;</td>
          <td class="paramname"><em>wParam</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">LONG&#160;</td>
          <td class="paramname"><em>lParam</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00916">916</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l00921"></a><span class="lineno">  921</span>&#160;{</div>
<div class="line"><a name="l00922"></a><span class="lineno">  922</span>&#160;    <a class="code" href="a03029.html">ENDDLGPARAMS</a>* pedp;</div>
<div class="line"><a name="l00923"></a><span class="lineno">  923</span>&#160;    LARGE_INTEGER li;</div>
<div class="line"><a name="l00924"></a><span class="lineno">  924</span>&#160;    WCHAR achFormat[<a class="code" href="a03239.html#a413912b9bd1a3ecf1768857b40cdffaa">CCHBODYMAX</a>];</div>
<div class="line"><a name="l00925"></a><span class="lineno">  925</span>&#160;    WCHAR achText[<a class="code" href="a03239.html#a413912b9bd1a3ecf1768857b40cdffaa">CCHBODYMAX</a>];</div>
<div class="line"><a name="l00926"></a><span class="lineno">  926</span>&#160;    <a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwData;</div>
<div class="line"><a name="l00927"></a><span class="lineno">  927</span>&#160;    USERTHREAD_FLAGS Flags;</div>
<div class="line"><a name="l00928"></a><span class="lineno">  928</span>&#160; </div>
<div class="line"><a name="l00929"></a><span class="lineno">  929</span>&#160;    <span class="keywordflow">switch</span> (msg) {</div>
<div class="line"><a name="l00930"></a><span class="lineno">  930</span>&#160;    <span class="keywordflow">case</span> WM_INITDIALOG:</div>
<div class="line"><a name="l00931"></a><span class="lineno">  931</span>&#160;        pedp = (<a class="code" href="a03029.html">ENDDLGPARAMS</a>*)lParam;</div>
<div class="line"><a name="l00932"></a><span class="lineno">  932</span>&#160; </div>
<div class="line"><a name="l00933"></a><span class="lineno">  933</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00934"></a><span class="lineno">  934</span>&#160;<span class="comment">         * Save this for later revalidation.</span></div>
<div class="line"><a name="l00935"></a><span class="lineno">  935</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00936"></a><span class="lineno">  936</span>&#160;        SetWindowLong(hwndDlg, GWL_USERDATA, (<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>)pedp-&gt;<a class="code" href="a03029.html#a0182b2e472b8af2291079784ca8926c9">h</a>);</div>
<div class="line"><a name="l00937"></a><span class="lineno">  937</span>&#160;        SetWindowLong(hwndDlg, DWL_USER, (<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>)pedp-&gt;<a class="code" href="a03029.html#a82c0d31cf840e5fedfaa52b799063e44">type</a>);</div>
<div class="line"><a name="l00938"></a><span class="lineno">  938</span>&#160; </div>
<div class="line"><a name="l00939"></a><span class="lineno">  939</span>&#160;        SetWindowText(hwndDlg, pedp-&gt;<a class="code" href="a03029.html#a31c2497f5c30692c601a804d9c586738">pszTitle</a>);</div>
<div class="line"><a name="l00940"></a><span class="lineno">  940</span>&#160; </div>
<div class="line"><a name="l00941"></a><span class="lineno">  941</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00942"></a><span class="lineno">  942</span>&#160;<span class="comment">         * Update text that says how long we&#39;ll wait.</span></div>
<div class="line"><a name="l00943"></a><span class="lineno">  943</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00944"></a><span class="lineno">  944</span>&#160;        GetDlgItemText(hwndDlg, IDIGNORE, achFormat, <a class="code" href="a03239.html#a413912b9bd1a3ecf1768857b40cdffaa">CCHBODYMAX</a>);</div>
<div class="line"><a name="l00945"></a><span class="lineno">  945</span>&#160;        wsprintf(achText, achFormat, pedp-&gt;<a class="code" href="a03029.html#a9c5b0e0659c167ccbc5a5bb9886ce14b">cSeconds</a>);</div>
<div class="line"><a name="l00946"></a><span class="lineno">  946</span>&#160;        SetDlgItemText(hwndDlg, IDIGNORE, achText);</div>
<div class="line"><a name="l00947"></a><span class="lineno">  947</span>&#160; </div>
<div class="line"><a name="l00948"></a><span class="lineno">  948</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00949"></a><span class="lineno">  949</span>&#160;<span class="comment">         * Make this dialog top most and foreground.</span></div>
<div class="line"><a name="l00950"></a><span class="lineno">  950</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00951"></a><span class="lineno">  951</span>&#160;        Flags.dwFlags = TIF_ALLOWFOREGROUNDACTIVATE;</div>
<div class="line"><a name="l00952"></a><span class="lineno">  952</span>&#160;        Flags.dwMask = TIF_ALLOWFOREGROUNDACTIVATE;</div>
<div class="line"><a name="l00953"></a><span class="lineno">  953</span>&#160;        <a class="code" href="a00362.html#af86a9b04196ca170fc6b6e4b4e6a5dbc">NtUserSetInformationThread</a>(NtCurrentThread(), UserThreadFlags,</div>
<div class="line"><a name="l00954"></a><span class="lineno">  954</span>&#160;                &amp;Flags, <span class="keyword">sizeof</span>(Flags));</div>
<div class="line"><a name="l00955"></a><span class="lineno">  955</span>&#160;        SetWindowPos(hwndDlg, HWND_TOPMOST, 0, 0, 0, 0,</div>
<div class="line"><a name="l00956"></a><span class="lineno">  956</span>&#160;                SWP_NOMOVE | SWP_NOSIZE);</div>
<div class="line"><a name="l00957"></a><span class="lineno">  957</span>&#160; </div>
<div class="line"><a name="l00958"></a><span class="lineno">  958</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00959"></a><span class="lineno">  959</span>&#160;<span class="comment">         * Set this timer so every 1/2 a second we can see if this app</span></div>
<div class="line"><a name="l00960"></a><span class="lineno">  960</span>&#160;<span class="comment">         * has gone away.</span></div>
<div class="line"><a name="l00961"></a><span class="lineno">  961</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00962"></a><span class="lineno">  962</span>&#160;        SetTimer(hwndDlg, 5, 500, NULL);</div>
<div class="line"><a name="l00963"></a><span class="lineno">  963</span>&#160;        <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l00964"></a><span class="lineno">  964</span>&#160; </div>
<div class="line"><a name="l00965"></a><span class="lineno">  965</span>&#160;    <span class="keywordflow">case</span> WM_TIMER:</div>
<div class="line"><a name="l00966"></a><span class="lineno">  966</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00967"></a><span class="lineno">  967</span>&#160;<span class="comment">         * If shutdown has been cancelled, bring down the dialog.</span></div>
<div class="line"><a name="l00968"></a><span class="lineno">  968</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00969"></a><span class="lineno">  969</span>&#160;        li.QuadPart  = 0;</div>
<div class="line"><a name="l00970"></a><span class="lineno">  970</span>&#160;        <span class="keywordflow">if</span> (NtWaitForSingleObject(<a class="code" href="a03260.html#a7734daf887ee2ecb9d7b91c68e67ba3a">heventCancel</a>, FALSE, &amp;li) == 0) {</div>
<div class="line"><a name="l00971"></a><span class="lineno">  971</span>&#160;            <a class="code" href="a00098.html#aa5a68d879547f0460331c71bee94763a">EndDialog</a>(hwndDlg, IDCANCEL);</div>
<div class="line"><a name="l00972"></a><span class="lineno">  972</span>&#160;            <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00973"></a><span class="lineno">  973</span>&#160;        }</div>
<div class="line"><a name="l00974"></a><span class="lineno">  974</span>&#160; </div>
<div class="line"><a name="l00975"></a><span class="lineno">  975</span>&#160;        dwData = GetWindowLong(hwndDlg, GWL_USERDATA);</div>
<div class="line"><a name="l00976"></a><span class="lineno">  976</span>&#160;        <span class="keywordflow">if</span> (GetWindowLong(hwndDlg, DWL_USER) == TYPE_CONSOLE_ID) {</div>
<div class="line"><a name="l00977"></a><span class="lineno">  977</span>&#160; </div>
<div class="line"><a name="l00978"></a><span class="lineno">  978</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00979"></a><span class="lineno">  979</span>&#160;<span class="comment">             * If it&#39;s the console calling us, check if the thread or process</span></div>
<div class="line"><a name="l00980"></a><span class="lineno">  980</span>&#160;<span class="comment">             * handle is still valid. If not, bring down the dialog.</span></div>
<div class="line"><a name="l00981"></a><span class="lineno">  981</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00982"></a><span class="lineno">  982</span>&#160;            <span class="keywordflow">if</span> (WaitForSingleObject((HANDLE)dwData, 0) != 0)</div>
<div class="line"><a name="l00983"></a><span class="lineno">  983</span>&#160;                <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00984"></a><span class="lineno">  984</span>&#160;        } <span class="keywordflow">else</span> <span class="keywordflow">if</span> (!(((PCSR_THREAD)dwData)-&gt;Flags &amp; CSR_THREAD_DESTROYED)) {</div>
<div class="line"><a name="l00985"></a><span class="lineno">  985</span>&#160; </div>
<div class="line"><a name="l00986"></a><span class="lineno">  986</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00987"></a><span class="lineno">  987</span>&#160;<span class="comment">             * If the thread is marked as destroyed, bring down the dialog.</span></div>
<div class="line"><a name="l00988"></a><span class="lineno">  988</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00989"></a><span class="lineno">  989</span>&#160;            <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00990"></a><span class="lineno">  990</span>&#160;        }</div>
<div class="line"><a name="l00991"></a><span class="lineno">  991</span>&#160; </div>
<div class="line"><a name="l00992"></a><span class="lineno">  992</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00993"></a><span class="lineno">  993</span>&#160;<span class="comment">         * This&#39;ll cause the dialog to go away and the wait for this app to</span></div>
<div class="line"><a name="l00994"></a><span class="lineno">  994</span>&#160;<span class="comment">         * close to return.</span></div>
<div class="line"><a name="l00995"></a><span class="lineno">  995</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00996"></a><span class="lineno">  996</span>&#160;        <a class="code" href="a00098.html#aa5a68d879547f0460331c71bee94763a">EndDialog</a>(hwndDlg, IDRETRY);</div>
<div class="line"><a name="l00997"></a><span class="lineno">  997</span>&#160;        <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00998"></a><span class="lineno">  998</span>&#160; </div>
<div class="line"><a name="l00999"></a><span class="lineno">  999</span>&#160;    <span class="keywordflow">case</span> WM_CLOSE:</div>
<div class="line"><a name="l01000"></a><span class="lineno"> 1000</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l01001"></a><span class="lineno"> 1001</span>&#160;<span class="comment">         * Assume WM_CLOSE means cancel shutdown</span></div>
<div class="line"><a name="l01002"></a><span class="lineno"> 1002</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l01003"></a><span class="lineno"> 1003</span>&#160;        wParam = IDCANCEL;</div>
<div class="line"><a name="l01004"></a><span class="lineno"> 1004</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l01005"></a><span class="lineno"> 1005</span>&#160;<span class="comment">         * falls through...</span></div>
<div class="line"><a name="l01006"></a><span class="lineno"> 1006</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l01007"></a><span class="lineno"> 1007</span>&#160; </div>
<div class="line"><a name="l01008"></a><span class="lineno"> 1008</span>&#160;    <span class="keywordflow">case</span> WM_COMMAND:</div>
<div class="line"><a name="l01009"></a><span class="lineno"> 1009</span>&#160;        <a class="code" href="a00098.html#aa5a68d879547f0460331c71bee94763a">EndDialog</a>(hwndDlg, LOWORD(wParam));</div>
<div class="line"><a name="l01010"></a><span class="lineno"> 1010</span>&#160;        <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l01011"></a><span class="lineno"> 1011</span>&#160;    }</div>
<div class="line"><a name="l01012"></a><span class="lineno"> 1012</span>&#160; </div>
<div class="line"><a name="l01013"></a><span class="lineno"> 1013</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l01014"></a><span class="lineno"> 1014</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a03239_source.html#l00042">CCHBODYMAX</a>, <a class="el" href="a03239_source.html#l00903">_ENDDLGPARAMS::cSeconds</a>, <a class="el" href="a00563_source.html#l00175">DWORD</a>, <a class="el" href="a00098_source.html#l00022">EndDialog()</a>, <a class="el" href="a03239_source.html#l00901">_ENDDLGPARAMS::h</a>, <a class="el" href="a03260_source.html#l00027">heventCancel</a>, <a class="el" href="a03614_source.html#l06050">NtUserSetInformationThread()</a>, <a class="el" href="a03239_source.html#l00900">_ENDDLGPARAMS::pszTitle</a> , 以及 <a class="el" href="a03239_source.html#l00902">_ENDDLGPARAMS::type</a>.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l01016">DoEndTaskDialog()</a>.</p>

</div>
</div>
<a id="aadc5a0499586d2b3c2ce8b850dc53abd"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aadc5a0499586d2b3c2ce8b850dc53abd">&#9670;&nbsp;</a></span>FindWindowFromThread()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">BOOL CALLBACK FindWindowFromThread </td>
          <td>(</td>
          <td class="paramtype">HWND&#160;</td>
          <td class="paramname"><em>hwnd</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">LPARAM&#160;</td>
          <td class="paramname"><em>lParam</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00558">558</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l00559"></a><span class="lineno">  559</span>&#160;{</div>
<div class="line"><a name="l00560"></a><span class="lineno">  560</span>&#160;    *((HWND *)lParam) = hwnd;</div>
<div class="line"><a name="l00561"></a><span class="lineno">  561</span>&#160;    <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l00562"></a><span class="lineno">  562</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l00572">SendShutdownMessages()</a>.</p>

</div>
</div>
<a id="a33b594ea0681c07ef423632f5645ff39"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a33b594ea0681c07ef423632f5645ff39">&#9670;&nbsp;</a></span>InternalCreateCallbackThread()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">HANDLE InternalCreateCallbackThread </td>
          <td>(</td>
          <td class="paramtype">HANDLE&#160;</td>
          <td class="paramname"><em>hProcess</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>&#160;</td>
          <td class="paramname"><em>lpfn</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>&#160;</td>
          <td class="paramname"><em>dwData</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l01302">1302</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l01306"></a><span class="lineno"> 1306</span>&#160;{</div>
<div class="line"><a name="l01307"></a><span class="lineno"> 1307</span>&#160;    LONG BasePriority;</div>
<div class="line"><a name="l01308"></a><span class="lineno"> 1308</span>&#160;    HANDLE hThread, hToken;</div>
<div class="line"><a name="l01309"></a><span class="lineno"> 1309</span>&#160;    PTOKEN_DEFAULT_DACL lpDaclDefault;</div>
<div class="line"><a name="l01310"></a><span class="lineno"> 1310</span>&#160;    TOKEN_DEFAULT_DACL daclDefault;</div>
<div class="line"><a name="l01311"></a><span class="lineno"> 1311</span>&#160;    ULONG cbDacl;</div>
<div class="line"><a name="l01312"></a><span class="lineno"> 1312</span>&#160;    <a class="code" href="a00899.html#a3cda359e32cea29097571bcf911dfccf">SECURITY_ATTRIBUTES</a> attrThread;</div>
<div class="line"><a name="l01313"></a><span class="lineno"> 1313</span>&#160;    SECURITY_DESCRIPTOR sd;</div>
<div class="line"><a name="l01314"></a><span class="lineno"> 1314</span>&#160;    <a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> idThread;</div>
<div class="line"><a name="l01315"></a><span class="lineno"> 1315</span>&#160;    NTSTATUS Status;</div>
<div class="line"><a name="l01316"></a><span class="lineno"> 1316</span>&#160; </div>
<div class="line"><a name="l01317"></a><span class="lineno"> 1317</span>&#160;    hThread = NULL;</div>
<div class="line"><a name="l01318"></a><span class="lineno"> 1318</span>&#160; </div>
<div class="line"><a name="l01319"></a><span class="lineno"> 1319</span>&#160;    Status = NtOpenProcessToken(hProcess, TOKEN_QUERY, &amp;hToken);</div>
<div class="line"><a name="l01320"></a><span class="lineno"> 1320</span>&#160;    <span class="keywordflow">if</span> (!NT_SUCCESS(Status)) {</div>
<div class="line"><a name="l01321"></a><span class="lineno"> 1321</span>&#160;        KdPrint((<span class="stringliteral">&quot;NtOpenProcessToken failed, status = %x\n&quot;</span>, Status));</div>
<div class="line"><a name="l01322"></a><span class="lineno"> 1322</span>&#160;        <span class="keywordflow">return</span> NULL;</div>
<div class="line"><a name="l01323"></a><span class="lineno"> 1323</span>&#160;    }</div>
<div class="line"><a name="l01324"></a><span class="lineno"> 1324</span>&#160; </div>
<div class="line"><a name="l01325"></a><span class="lineno"> 1325</span>&#160;    cbDacl = 0;</div>
<div class="line"><a name="l01326"></a><span class="lineno"> 1326</span>&#160;    NtQueryInformationToken(hToken,</div>
<div class="line"><a name="l01327"></a><span class="lineno"> 1327</span>&#160;            TokenDefaultDacl,</div>
<div class="line"><a name="l01328"></a><span class="lineno"> 1328</span>&#160;            &amp;daclDefault,</div>
<div class="line"><a name="l01329"></a><span class="lineno"> 1329</span>&#160;            <span class="keyword">sizeof</span>(daclDefault),</div>
<div class="line"><a name="l01330"></a><span class="lineno"> 1330</span>&#160;            &amp;cbDacl);</div>
<div class="line"><a name="l01331"></a><span class="lineno"> 1331</span>&#160; </div>
<div class="line"><a name="l01332"></a><span class="lineno"> 1332</span>&#160;    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();  <span class="comment">// to synchronize heap</span></div>
<div class="line"><a name="l01333"></a><span class="lineno"> 1333</span>&#160;    lpDaclDefault = (PTOKEN_DEFAULT_DACL)LocalAlloc(LMEM_FIXED, cbDacl);</div>
<div class="line"><a name="l01334"></a><span class="lineno"> 1334</span>&#160;    <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01335"></a><span class="lineno"> 1335</span>&#160; </div>
<div class="line"><a name="l01336"></a><span class="lineno"> 1336</span>&#160;    <span class="keywordflow">if</span> (lpDaclDefault == NULL) {</div>
<div class="line"><a name="l01337"></a><span class="lineno"> 1337</span>&#160;        KdPrint((<span class="stringliteral">&quot;LocalAlloc failed for lpDaclDefault&quot;</span>));</div>
<div class="line"><a name="l01338"></a><span class="lineno"> 1338</span>&#160;        <span class="keywordflow">goto</span> closeexit;</div>
<div class="line"><a name="l01339"></a><span class="lineno"> 1339</span>&#160;    }</div>
<div class="line"><a name="l01340"></a><span class="lineno"> 1340</span>&#160; </div>
<div class="line"><a name="l01341"></a><span class="lineno"> 1341</span>&#160;    Status = NtQueryInformationToken(hToken,</div>
<div class="line"><a name="l01342"></a><span class="lineno"> 1342</span>&#160;            TokenDefaultDacl,</div>
<div class="line"><a name="l01343"></a><span class="lineno"> 1343</span>&#160;            lpDaclDefault,</div>
<div class="line"><a name="l01344"></a><span class="lineno"> 1344</span>&#160;            cbDacl,</div>
<div class="line"><a name="l01345"></a><span class="lineno"> 1345</span>&#160;            &amp;cbDacl);</div>
<div class="line"><a name="l01346"></a><span class="lineno"> 1346</span>&#160;    <span class="keywordflow">if</span> (!NT_SUCCESS(Status)) {</div>
<div class="line"><a name="l01347"></a><span class="lineno"> 1347</span>&#160;        KdPrint((<span class="stringliteral">&quot;NtQueryInformationToken failed, status = %x\n&quot;</span>, Status));</div>
<div class="line"><a name="l01348"></a><span class="lineno"> 1348</span>&#160;        <span class="keywordflow">goto</span> freeexit;</div>
<div class="line"><a name="l01349"></a><span class="lineno"> 1349</span>&#160;    }</div>
<div class="line"><a name="l01350"></a><span class="lineno"> 1350</span>&#160; </div>
<div class="line"><a name="l01351"></a><span class="lineno"> 1351</span>&#160;    <span class="keywordflow">if</span> (!NT_SUCCESS(RtlCreateSecurityDescriptor(&amp;sd,</div>
<div class="line"><a name="l01352"></a><span class="lineno"> 1352</span>&#160;            SECURITY_DESCRIPTOR_REVISION1))) {</div>
<div class="line"><a name="l01353"></a><span class="lineno"> 1353</span>&#160;        <a class="code" href="a00371.html#a162a73e20dfabca084a3ebb4581631a8">UserAssert</a>(FALSE);</div>
<div class="line"><a name="l01354"></a><span class="lineno"> 1354</span>&#160;        <span class="keywordflow">goto</span> freeexit;</div>
<div class="line"><a name="l01355"></a><span class="lineno"> 1355</span>&#160;    }</div>
<div class="line"><a name="l01356"></a><span class="lineno"> 1356</span>&#160; </div>
<div class="line"><a name="l01357"></a><span class="lineno"> 1357</span>&#160;    RtlSetDaclSecurityDescriptor(&amp;sd, TRUE, lpDaclDefault-&gt;DefaultDacl, TRUE);</div>
<div class="line"><a name="l01358"></a><span class="lineno"> 1358</span>&#160; </div>
<div class="line"><a name="l01359"></a><span class="lineno"> 1359</span>&#160;    attrThread.nLength = <span class="keyword">sizeof</span>(attrThread);</div>
<div class="line"><a name="l01360"></a><span class="lineno"> 1360</span>&#160;    attrThread.lpSecurityDescriptor = &amp;sd;</div>
<div class="line"><a name="l01361"></a><span class="lineno"> 1361</span>&#160;    attrThread.bInheritHandle = FALSE;</div>
<div class="line"><a name="l01362"></a><span class="lineno"> 1362</span>&#160; </div>
<div class="line"><a name="l01363"></a><span class="lineno"> 1363</span>&#160;    GetLastError();</div>
<div class="line"><a name="l01364"></a><span class="lineno"> 1364</span>&#160;    hThread = CreateRemoteThread(hProcess,</div>
<div class="line"><a name="l01365"></a><span class="lineno"> 1365</span>&#160;        &amp;attrThread,</div>
<div class="line"><a name="l01366"></a><span class="lineno"> 1366</span>&#160;        0L,</div>
<div class="line"><a name="l01367"></a><span class="lineno"> 1367</span>&#160;        (LPTHREAD_START_ROUTINE)lpfn,</div>
<div class="line"><a name="l01368"></a><span class="lineno"> 1368</span>&#160;        (LPVOID)dwData,</div>
<div class="line"><a name="l01369"></a><span class="lineno"> 1369</span>&#160;        0,</div>
<div class="line"><a name="l01370"></a><span class="lineno"> 1370</span>&#160;        &amp;idThread);</div>
<div class="line"><a name="l01371"></a><span class="lineno"> 1371</span>&#160; </div>
<div class="line"><a name="l01372"></a><span class="lineno"> 1372</span>&#160;    <span class="keywordflow">if</span> (hThread != NULL) {</div>
<div class="line"><a name="l01373"></a><span class="lineno"> 1373</span>&#160;        BasePriority = THREAD_PRIORITY_HIGHEST;</div>
<div class="line"><a name="l01374"></a><span class="lineno"> 1374</span>&#160;        NtSetInformationThread(hThread,</div>
<div class="line"><a name="l01375"></a><span class="lineno"> 1375</span>&#160;                               ThreadBasePriority,</div>
<div class="line"><a name="l01376"></a><span class="lineno"> 1376</span>&#160;                               &amp;BasePriority,</div>
<div class="line"><a name="l01377"></a><span class="lineno"> 1377</span>&#160;                               <span class="keyword">sizeof</span>(LONG));</div>
<div class="line"><a name="l01378"></a><span class="lineno"> 1378</span>&#160;    }</div>
<div class="line"><a name="l01379"></a><span class="lineno"> 1379</span>&#160; </div>
<div class="line"><a name="l01380"></a><span class="lineno"> 1380</span>&#160;freeexit:</div>
<div class="line"><a name="l01381"></a><span class="lineno"> 1381</span>&#160;    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();  <span class="comment">// to synchronize heap</span></div>
<div class="line"><a name="l01382"></a><span class="lineno"> 1382</span>&#160;    LocalFree((HANDLE)lpDaclDefault);</div>
<div class="line"><a name="l01383"></a><span class="lineno"> 1383</span>&#160;    <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01384"></a><span class="lineno"> 1384</span>&#160; </div>
<div class="line"><a name="l01385"></a><span class="lineno"> 1385</span>&#160;closeexit:</div>
<div class="line"><a name="l01386"></a><span class="lineno"> 1386</span>&#160;    NtClose(hToken);</div>
<div class="line"><a name="l01387"></a><span class="lineno"> 1387</span>&#160; </div>
<div class="line"><a name="l01388"></a><span class="lineno"> 1388</span>&#160;    <span class="keywordflow">return</span> hThread;</div>
<div class="line"><a name="l01389"></a><span class="lineno"> 1389</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a00563_source.html#l00175">DWORD</a>, <a class="el" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit()</a>, <a class="el" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit()</a> , 以及 <a class="el" href="a00950_source.html#l00117">UserAssert</a>.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l01188">WowExitTask()</a>.</p>

</div>
</div>
<a id="a9eb3f9f3d06aec70363cbde212183728"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a9eb3f9f3d06aec70363cbde212183728">&#9670;&nbsp;</a></span>InternalDoEndTaskDialog()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int InternalDoEndTaskDialog </td>
          <td>(</td>
          <td class="paramtype">TCHAR *&#160;</td>
          <td class="paramname"><em>pszTitle</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">HANDLE&#160;</td>
          <td class="paramname"><em>h</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">int&#160;</td>
          <td class="paramname"><em>cSeconds</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l01270">1270</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l01274"></a><span class="lineno"> 1274</span>&#160;{</div>
<div class="line"><a name="l01275"></a><span class="lineno"> 1275</span>&#160;    <span class="keywordtype">int</span> iRet;</div>
<div class="line"><a name="l01276"></a><span class="lineno"> 1276</span>&#160; </div>
<div class="line"><a name="l01277"></a><span class="lineno"> 1277</span>&#160;    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l01278"></a><span class="lineno"> 1278</span>&#160; </div>
<div class="line"><a name="l01279"></a><span class="lineno"> 1279</span>&#160;    <a class="code" href="a03239.html#a03f0b7bae20eca44bfb023829e957e3b">gcInternalDoEndTaskDialog</a>++;</div>
<div class="line"><a name="l01280"></a><span class="lineno"> 1280</span>&#160; </div>
<div class="line"><a name="l01281"></a><span class="lineno"> 1281</span>&#160;    <span class="keywordflow">try</span> {</div>
<div class="line"><a name="l01282"></a><span class="lineno"> 1282</span>&#160;        iRet = <a class="code" href="a03239.html#a6e1f93446f792e5b40d9bd6307c4430c">DoEndTaskDialog</a>(pszTitle, h, TYPE_CONSOLE_ID, cSeconds);</div>
<div class="line"><a name="l01283"></a><span class="lineno"> 1283</span>&#160;    } <span class="keywordflow">finally</span> {</div>
<div class="line"><a name="l01284"></a><span class="lineno"> 1284</span>&#160;        <a class="code" href="a03239.html#a03f0b7bae20eca44bfb023829e957e3b">gcInternalDoEndTaskDialog</a>--;</div>
<div class="line"><a name="l01285"></a><span class="lineno"> 1285</span>&#160;    }</div>
<div class="line"><a name="l01286"></a><span class="lineno"> 1286</span>&#160; </div>
<div class="line"><a name="l01287"></a><span class="lineno"> 1287</span>&#160;    <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01288"></a><span class="lineno"> 1288</span>&#160; </div>
<div class="line"><a name="l01289"></a><span class="lineno"> 1289</span>&#160;    <span class="keywordflow">return</span> iRet;</div>
<div class="line"><a name="l01290"></a><span class="lineno"> 1290</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a03239_source.html#l01016">DoEndTaskDialog()</a>, <a class="el" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit()</a>, <a class="el" href="a03239_source.html#l00066">gcInternalDoEndTaskDialog</a> , 以及 <a class="el" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit()</a>.</p>

</div>
</div>
<a id="ab7895dbdc5b191a5fd3eecbe22ca64a3"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ab7895dbdc5b191a5fd3eecbe22ca64a3">&#9670;&nbsp;</a></span>InternalWaitCancel()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> InternalWaitCancel </td>
          <td>(</td>
          <td class="paramtype">HANDLE&#160;</td>
          <td class="paramname"><em>handle</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>&#160;</td>
          <td class="paramname"><em>dwMilliseconds</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l01250">1250</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l01253"></a><span class="lineno"> 1253</span>&#160;{</div>
<div class="line"><a name="l01254"></a><span class="lineno"> 1254</span>&#160;    HANDLE ahandle[2];</div>
<div class="line"><a name="l01255"></a><span class="lineno"> 1255</span>&#160; </div>
<div class="line"><a name="l01256"></a><span class="lineno"> 1256</span>&#160;    ahandle[0] = handle;</div>
<div class="line"><a name="l01257"></a><span class="lineno"> 1257</span>&#160;    ahandle[1] = <a class="code" href="a03260.html#a7734daf887ee2ecb9d7b91c68e67ba3a">heventCancel</a>;</div>
<div class="line"><a name="l01258"></a><span class="lineno"> 1258</span>&#160; </div>
<div class="line"><a name="l01259"></a><span class="lineno"> 1259</span>&#160;    <span class="keywordflow">return</span> WaitForMultipleObjects(2, ahandle, FALSE, dwMilliseconds);</div>
<div class="line"><a name="l01260"></a><span class="lineno"> 1260</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a03260_source.html#l00027">heventCancel</a>.</p>

</div>
</div>
<a id="ad5164087ca1b77435e44c75a73c0538f"></a>
<h2 class="memtitle"><span class="permalink"><a href="#ad5164087ca1b77435e44c75a73c0538f">&#9670;&nbsp;</a></span>IsPrivileged()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">BOOL IsPrivileged </td>
          <td>(</td>
          <td class="paramtype">PPRIVILEGE_SET&#160;</td>
          <td class="paramname"><em>ppSet</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l01428">1428</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l01430"></a><span class="lineno"> 1430</span>&#160;{</div>
<div class="line"><a name="l01431"></a><span class="lineno"> 1431</span>&#160;    HANDLE hToken;</div>
<div class="line"><a name="l01432"></a><span class="lineno"> 1432</span>&#160;    NTSTATUS Status;</div>
<div class="line"><a name="l01433"></a><span class="lineno"> 1433</span>&#160;    BOOLEAN bResult = FALSE;</div>
<div class="line"><a name="l01434"></a><span class="lineno"> 1434</span>&#160;    UNICODE_STRING strSubSystem;</div>
<div class="line"><a name="l01435"></a><span class="lineno"> 1435</span>&#160; </div>
<div class="line"><a name="l01436"></a><span class="lineno"> 1436</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01437"></a><span class="lineno"> 1437</span>&#160;<span class="comment">     * Impersonate the client</span></div>
<div class="line"><a name="l01438"></a><span class="lineno"> 1438</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01439"></a><span class="lineno"> 1439</span>&#160;    <span class="keywordflow">if</span> (!CsrImpersonateClient(NULL))</div>
<div class="line"><a name="l01440"></a><span class="lineno"> 1440</span>&#160;        <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l01441"></a><span class="lineno"> 1441</span>&#160; </div>
<div class="line"><a name="l01442"></a><span class="lineno"> 1442</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01443"></a><span class="lineno"> 1443</span>&#160;<span class="comment">     * Open the client&#39;s token</span></div>
<div class="line"><a name="l01444"></a><span class="lineno"> 1444</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01445"></a><span class="lineno"> 1445</span>&#160;    RtlInitUnicodeString(&amp;strSubSystem, L<span class="stringliteral">&quot;USER32&quot;</span>);</div>
<div class="line"><a name="l01446"></a><span class="lineno"> 1446</span>&#160;    <span class="keywordflow">if</span> (NT_SUCCESS(Status = NtOpenThreadToken(NtCurrentThread(), TOKEN_QUERY,</div>
<div class="line"><a name="l01447"></a><span class="lineno"> 1447</span>&#160;            (BOOLEAN)TRUE, &amp;hToken))) {</div>
<div class="line"><a name="l01448"></a><span class="lineno"> 1448</span>&#160; </div>
<div class="line"><a name="l01449"></a><span class="lineno"> 1449</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l01450"></a><span class="lineno"> 1450</span>&#160;<span class="comment">         * Perform the check</span></div>
<div class="line"><a name="l01451"></a><span class="lineno"> 1451</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l01452"></a><span class="lineno"> 1452</span>&#160;        Status = NtPrivilegeCheck(hToken, ppSet, &amp;bResult);</div>
<div class="line"><a name="l01453"></a><span class="lineno"> 1453</span>&#160;        NtPrivilegeObjectAuditAlarm(&amp;strSubSystem, NULL, hToken,</div>
<div class="line"><a name="l01454"></a><span class="lineno"> 1454</span>&#160;                0, ppSet, bResult);</div>
<div class="line"><a name="l01455"></a><span class="lineno"> 1455</span>&#160;        NtClose(hToken);</div>
<div class="line"><a name="l01456"></a><span class="lineno"> 1456</span>&#160;        <span class="keywordflow">if</span> (!bResult) {</div>
<div class="line"><a name="l01457"></a><span class="lineno"> 1457</span>&#160;            SetLastError(ERROR_ACCESS_DENIED);</div>
<div class="line"><a name="l01458"></a><span class="lineno"> 1458</span>&#160;        }</div>
<div class="line"><a name="l01459"></a><span class="lineno"> 1459</span>&#160;    }</div>
<div class="line"><a name="l01460"></a><span class="lineno"> 1460</span>&#160;    CsrRevertToSelf();</div>
<div class="line"><a name="l01461"></a><span class="lineno"> 1461</span>&#160;    <span class="keywordflow">if</span> (!NT_SUCCESS(Status))</div>
<div class="line"><a name="l01462"></a><span class="lineno"> 1462</span>&#160;        SetLastError(RtlNtStatusToDosError(Status));</div>
<div class="line"><a name="l01463"></a><span class="lineno"> 1463</span>&#160; </div>
<div class="line"><a name="l01464"></a><span class="lineno"> 1464</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01465"></a><span class="lineno"> 1465</span>&#160;<span class="comment">     * Return result of privilege check</span></div>
<div class="line"><a name="l01466"></a><span class="lineno"> 1466</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01467"></a><span class="lineno"> 1467</span>&#160;    <span class="keywordflow">return</span> (BOOL)(bResult &amp;&amp; NT_SUCCESS(Status));</div>
<div class="line"><a name="l01468"></a><span class="lineno"> 1468</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a00371_source.html#l00030">RIP_VERBOSE</a> , 以及 <a class="el" href="a00371_source.html#l00119">RIPERR0</a>.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l01480">SrvRegisterServicesProcess()</a>.</p>

</div>
</div>
<a id="adaea996c1b105ea7798e9b4763cb7135"></a>
<h2 class="memtitle"><span class="permalink"><a href="#adaea996c1b105ea7798e9b4763cb7135">&#9670;&nbsp;</a></span>MySendEndSessionMessages()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> MySendEndSessionMessages </td>
          <td>(</td>
          <td class="paramtype">HWND&#160;</td>
          <td class="paramname"><em>hwnd</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">PCSR_THREAD&#160;</td>
          <td class="paramname"><em>pcsrt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">BOOL&#160;</td>
          <td class="paramname"><em>fEndTask</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>&#160;</td>
          <td class="paramname"><em>dwClientFlags</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00634">634</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l00639"></a><span class="lineno">  639</span>&#160;{</div>
<div class="line"><a name="l00640"></a><span class="lineno">  640</span>&#160;    HWND hwndOwner;</div>
<div class="line"><a name="l00641"></a><span class="lineno">  641</span>&#160;    LARGE_INTEGER li;</div>
<div class="line"><a name="l00642"></a><span class="lineno">  642</span>&#160;    <a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwRet;</div>
<div class="line"><a name="l00643"></a><span class="lineno">  643</span>&#160;    <span class="keywordtype">int</span> cLoops;</div>
<div class="line"><a name="l00644"></a><span class="lineno">  644</span>&#160;    <span class="keywordtype">int</span> cSeconds;</div>
<div class="line"><a name="l00645"></a><span class="lineno">  645</span>&#160;    WCHAR achName[<a class="code" href="a03239.html#a413912b9bd1a3ecf1768857b40cdffaa">CCHBODYMAX</a>];</div>
<div class="line"><a name="l00646"></a><span class="lineno">  646</span>&#160;    BOOL fPostedClose;</div>
<div class="line"><a name="l00647"></a><span class="lineno">  647</span>&#160;    BOOL fDialogFirst;</div>
<div class="line"><a name="l00648"></a><span class="lineno">  648</span>&#160;    <a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwFlags;</div>
<div class="line"><a name="l00649"></a><span class="lineno">  649</span>&#160;    <a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> dwHungApp;</div>
<div class="line"><a name="l00650"></a><span class="lineno">  650</span>&#160;    HANDLE hNull = NULL;</div>
<div class="line"><a name="l00651"></a><span class="lineno">  651</span>&#160;    NTSTATUS Status;</div>
<div class="line"><a name="l00652"></a><span class="lineno">  652</span>&#160; </div>
<div class="line"><a name="l00653"></a><span class="lineno">  653</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00654"></a><span class="lineno">  654</span>&#160;<span class="comment">     * We&#39;ve got a random top level window for this application. Find the</span></div>
<div class="line"><a name="l00655"></a><span class="lineno">  655</span>&#160;<span class="comment">     * root owner, because that&#39;s who we want to send the WM_CLOSE to.</span></div>
<div class="line"><a name="l00656"></a><span class="lineno">  656</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00657"></a><span class="lineno">  657</span>&#160;    <span class="keywordflow">while</span> ((hwndOwner = <a class="code" href="a03743.html#a72ab23f7e5d7d08157db573dc8666aff">GetWindow</a>(hwnd, GW_OWNER)) != NULL)</div>
<div class="line"><a name="l00658"></a><span class="lineno">  658</span>&#160;        hwnd = hwndOwner;</div>
<div class="line"><a name="l00659"></a><span class="lineno">  659</span>&#160; </div>
<div class="line"><a name="l00660"></a><span class="lineno">  660</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00661"></a><span class="lineno">  661</span>&#160;<span class="comment">     * We expect this application to process this shutdown request,</span></div>
<div class="line"><a name="l00662"></a><span class="lineno">  662</span>&#160;<span class="comment">     * so make it the foreground window so it has foreground priority.</span></div>
<div class="line"><a name="l00663"></a><span class="lineno">  663</span>&#160;<span class="comment">     * This won&#39;t leave the critical section.</span></div>
<div class="line"><a name="l00664"></a><span class="lineno">  664</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00665"></a><span class="lineno">  665</span>&#160;    <a class="code" href="a00026.html#a0427963300ccb73271752f9310fab5c8">SetForegroundWindow</a>(hwnd);</div>
<div class="line"><a name="l00666"></a><span class="lineno">  666</span>&#160; </div>
<div class="line"><a name="l00667"></a><span class="lineno">  667</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00668"></a><span class="lineno">  668</span>&#160;<span class="comment">     * Send the WM_CLIENTSHUTDOWN message for end-session. When the app</span></div>
<div class="line"><a name="l00669"></a><span class="lineno">  669</span>&#160;<span class="comment">     * receives this, it&#39;ll then get WM_QUERYENDSESSION and WM_ENDSESSION</span></div>
<div class="line"><a name="l00670"></a><span class="lineno">  670</span>&#160;<span class="comment">     * messages.</span></div>
<div class="line"><a name="l00671"></a><span class="lineno">  671</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00672"></a><span class="lineno">  672</span>&#160;    <span class="keywordflow">if</span> (!fEndTask) {</div>
<div class="line"><a name="l00673"></a><span class="lineno">  673</span>&#160;        USERTHREAD_FLAGS Flags;</div>
<div class="line"><a name="l00674"></a><span class="lineno">  674</span>&#160; </div>
<div class="line"><a name="l00675"></a><span class="lineno">  675</span>&#160;        Flags.dwFlags = 0;</div>
<div class="line"><a name="l00676"></a><span class="lineno">  676</span>&#160;        Flags.dwMask = (TIF_SHUTDOWNCOMPLETE | TIF_ALLOWSHUTDOWN);</div>
<div class="line"><a name="l00677"></a><span class="lineno">  677</span>&#160;        <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00678"></a><span class="lineno">  678</span>&#160;        Status = <a class="code" href="a00362.html#af86a9b04196ca170fc6b6e4b4e6a5dbc">NtUserSetInformationThread</a>(pcsrt-&gt;ThreadHandle,</div>
<div class="line"><a name="l00679"></a><span class="lineno">  679</span>&#160;                UserThreadFlags, &amp;Flags, <span class="keyword">sizeof</span>(Flags));</div>
<div class="line"><a name="l00680"></a><span class="lineno">  680</span>&#160;        <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00681"></a><span class="lineno">  681</span>&#160;        <span class="keywordflow">if</span> (!NT_SUCCESS(Status))</div>
<div class="line"><a name="l00682"></a><span class="lineno">  682</span>&#160;            <span class="keywordflow">return</span> <a class="code" href="a03239.html#aab5abd3edec726f9dd6d86c33e7725c4">CMDEND_APPSAYSOK</a>;</div>
<div class="line"><a name="l00683"></a><span class="lineno">  683</span>&#160; </div>
<div class="line"><a name="l00684"></a><span class="lineno">  684</span>&#160;        <a class="code" href="a00356.html#a1e4f6d327f4f3c923ad4f870bc4cd259">SendNotifyMessage</a>(hwnd, WM_CLIENTSHUTDOWN, dwClientFlags, 0);</div>
<div class="line"><a name="l00685"></a><span class="lineno">  685</span>&#160;    }</div>
<div class="line"><a name="l00686"></a><span class="lineno">  686</span>&#160; </div>
<div class="line"><a name="l00687"></a><span class="lineno">  687</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00688"></a><span class="lineno">  688</span>&#160;<span class="comment">     * If the main window is disabled, bring up the end-task window first,</span></div>
<div class="line"><a name="l00689"></a><span class="lineno">  689</span>&#160;<span class="comment">     * right away, only if this the WM_CLOSE case.</span></div>
<div class="line"><a name="l00690"></a><span class="lineno">  690</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00691"></a><span class="lineno">  691</span>&#160;    fDialogFirst = FALSE;</div>
<div class="line"><a name="l00692"></a><span class="lineno">  692</span>&#160;    <span class="keywordflow">if</span> (fEndTask &amp;&amp; (GetWindowLong(hwnd, GWL_STYLE) &amp; WS_DISABLED))</div>
<div class="line"><a name="l00693"></a><span class="lineno">  693</span>&#160;        fDialogFirst = TRUE;</div>
<div class="line"><a name="l00694"></a><span class="lineno">  694</span>&#160; </div>
<div class="line"><a name="l00695"></a><span class="lineno">  695</span>&#160;    fPostedClose = FALSE;</div>
<div class="line"><a name="l00696"></a><span class="lineno">  696</span>&#160;    <span class="keywordflow">while</span> (TRUE) {</div>
<div class="line"><a name="l00697"></a><span class="lineno">  697</span>&#160;        <span class="keywordflow">if</span> (fEndTask) {</div>
<div class="line"><a name="l00698"></a><span class="lineno">  698</span>&#160;            cLoops   = (CMSHUNGAPPTIMEOUT / CMSSLEEP);</div>
<div class="line"><a name="l00699"></a><span class="lineno">  699</span>&#160;            cSeconds = (CMSHUNGAPPTIMEOUT / 1000);</div>
<div class="line"><a name="l00700"></a><span class="lineno">  700</span>&#160;        }</div>
<div class="line"><a name="l00701"></a><span class="lineno">  701</span>&#160;        <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00702"></a><span class="lineno">  702</span>&#160;            cLoops   = (CMSWAITTOKILLTIMEOUT / CMSSLEEP);</div>
<div class="line"><a name="l00703"></a><span class="lineno">  703</span>&#160;            cSeconds = (CMSWAITTOKILLTIMEOUT / 1000);</div>
<div class="line"><a name="l00704"></a><span class="lineno">  704</span>&#160;        }</div>
<div class="line"><a name="l00705"></a><span class="lineno">  705</span>&#160; </div>
<div class="line"><a name="l00706"></a><span class="lineno">  706</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00707"></a><span class="lineno">  707</span>&#160;<span class="comment">         * If end-task and not shutdown, must give this app a WM_CLOSE</span></div>
<div class="line"><a name="l00708"></a><span class="lineno">  708</span>&#160;<span class="comment">         * message. Can&#39;t do this if it has a dialog up because it is in</span></div>
<div class="line"><a name="l00709"></a><span class="lineno">  709</span>&#160;<span class="comment">         * the wrong processing loop. We detect this by seeing if the window</span></div>
<div class="line"><a name="l00710"></a><span class="lineno">  710</span>&#160;<span class="comment">         * is disabled - if it is, we don&#39;t send it a WM_CLOSE and instead</span></div>
<div class="line"><a name="l00711"></a><span class="lineno">  711</span>&#160;<span class="comment">         * bring up the end task dialog right away (this is exactly compatible</span></div>
<div class="line"><a name="l00712"></a><span class="lineno">  712</span>&#160;<span class="comment">         * with win3.1 taskmgr.exe).</span></div>
<div class="line"><a name="l00713"></a><span class="lineno">  713</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00714"></a><span class="lineno">  714</span>&#160;        <span class="keywordflow">if</span> (fEndTask) {</div>
<div class="line"><a name="l00715"></a><span class="lineno">  715</span>&#160;            <span class="keywordflow">if</span> (!fPostedClose &amp;&amp; <a class="code" href="a03743.html#ac5ede70e870dc1cf540d7524887e4edc">IsWindow</a>(hwnd) &amp;&amp;</div>
<div class="line"><a name="l00716"></a><span class="lineno">  716</span>&#160;                    !(GetWindowLong(hwnd, GWL_STYLE) &amp; WS_DISABLED)) {</div>
<div class="line"><a name="l00717"></a><span class="lineno">  717</span>&#160;                <a class="code" href="a00356.html#a3f53b9d5a549a62853c4e3fb22b649d7">PostMessage</a>(hwnd, WM_CLOSE, 0, 0L);</div>
<div class="line"><a name="l00718"></a><span class="lineno">  718</span>&#160;                fPostedClose = TRUE;</div>
<div class="line"><a name="l00719"></a><span class="lineno">  719</span>&#160;            }</div>
<div class="line"><a name="l00720"></a><span class="lineno">  720</span>&#160;        }</div>
<div class="line"><a name="l00721"></a><span class="lineno">  721</span>&#160; </div>
<div class="line"><a name="l00722"></a><span class="lineno">  722</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00723"></a><span class="lineno">  723</span>&#160;<span class="comment">         * Every so often wake up to see if the app is hung, and if not go</span></div>
<div class="line"><a name="l00724"></a><span class="lineno">  724</span>&#160;<span class="comment">         * back to sleep until we&#39;ve run through our timeout.</span></div>
<div class="line"><a name="l00725"></a><span class="lineno">  725</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00726"></a><span class="lineno">  726</span>&#160;        <span class="keywordflow">while</span> (cLoops--) {</div>
<div class="line"><a name="l00727"></a><span class="lineno">  727</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00728"></a><span class="lineno">  728</span>&#160;<span class="comment">             * If a WM_QUERY/ENDSESSION has been answered to, return.</span></div>
<div class="line"><a name="l00729"></a><span class="lineno">  729</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00730"></a><span class="lineno">  730</span>&#160;            <span class="keywordflow">if</span> (!fEndTask) {</div>
<div class="line"><a name="l00731"></a><span class="lineno">  731</span>&#160;                <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00732"></a><span class="lineno">  732</span>&#160;                <a class="code" href="a00362.html#a4d1853d31fa66209a2b02615f3cf1a97">NtUserQueryInformationThread</a>(pcsrt-&gt;ThreadHandle,</div>
<div class="line"><a name="l00733"></a><span class="lineno">  733</span>&#160;                        UserThreadFlags, &amp;dwFlags, <span class="keyword">sizeof</span>(<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>), NULL);</div>
<div class="line"><a name="l00734"></a><span class="lineno">  734</span>&#160;                <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00735"></a><span class="lineno">  735</span>&#160;                <span class="keywordflow">if</span> (dwFlags &amp; TIF_SHUTDOWNCOMPLETE) {</div>
<div class="line"><a name="l00736"></a><span class="lineno">  736</span>&#160;                    <span class="keywordflow">if</span> (dwFlags &amp; TIF_ALLOWSHUTDOWN)</div>
<div class="line"><a name="l00737"></a><span class="lineno">  737</span>&#160;                        <span class="keywordflow">return</span> <a class="code" href="a03239.html#aab5abd3edec726f9dd6d86c33e7725c4">CMDEND_APPSAYSOK</a>;</div>
<div class="line"><a name="l00738"></a><span class="lineno">  738</span>&#160;                    <span class="keywordflow">return</span> <a class="code" href="a03239.html#ad213141f4fe1fd382bc14446b8e021c5">CMDEND_APPSAYSNOTOK</a>;</div>
<div class="line"><a name="l00739"></a><span class="lineno">  739</span>&#160;                }</div>
<div class="line"><a name="l00740"></a><span class="lineno">  740</span>&#160;            }</div>
<div class="line"><a name="l00741"></a><span class="lineno">  741</span>&#160; </div>
<div class="line"><a name="l00742"></a><span class="lineno">  742</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00743"></a><span class="lineno">  743</span>&#160;<span class="comment">             * If the thread is gone, we&#39;re done.</span></div>
<div class="line"><a name="l00744"></a><span class="lineno">  744</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00745"></a><span class="lineno">  745</span>&#160;            <span class="keywordflow">if</span> (pcsrt-&gt;Flags &amp; CSR_THREAD_DESTROYED) {</div>
<div class="line"><a name="l00746"></a><span class="lineno">  746</span>&#160;                <span class="keywordflow">return</span> <a class="code" href="a03239.html#aab5abd3edec726f9dd6d86c33e7725c4">CMDEND_APPSAYSOK</a>;</div>
<div class="line"><a name="l00747"></a><span class="lineno">  747</span>&#160;            }</div>
<div class="line"><a name="l00748"></a><span class="lineno">  748</span>&#160; </div>
<div class="line"><a name="l00749"></a><span class="lineno">  749</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00750"></a><span class="lineno">  750</span>&#160;<span class="comment">             * If the dialog should be brought up first (because the window</span></div>
<div class="line"><a name="l00751"></a><span class="lineno">  751</span>&#160;<span class="comment">             * was initially disabled), do it.</span></div>
<div class="line"><a name="l00752"></a><span class="lineno">  752</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00753"></a><span class="lineno">  753</span>&#160;            <span class="keywordflow">if</span> (fDialogFirst) {</div>
<div class="line"><a name="l00754"></a><span class="lineno">  754</span>&#160;                fDialogFirst = FALSE;</div>
<div class="line"><a name="l00755"></a><span class="lineno">  755</span>&#160;                <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00756"></a><span class="lineno">  756</span>&#160;            }</div>
<div class="line"><a name="l00757"></a><span class="lineno">  757</span>&#160; </div>
<div class="line"><a name="l00758"></a><span class="lineno">  758</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00759"></a><span class="lineno">  759</span>&#160;<span class="comment">             * if we we&#39;re externally cancelled get out</span></div>
<div class="line"><a name="l00760"></a><span class="lineno">  760</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00761"></a><span class="lineno">  761</span>&#160;            li.QuadPart = 0;</div>
<div class="line"><a name="l00762"></a><span class="lineno">  762</span>&#160;            <span class="keywordflow">if</span> (NtWaitForSingleObject(<a class="code" href="a03260.html#a7734daf887ee2ecb9d7b91c68e67ba3a">heventCancel</a>, FALSE, &amp;li) == 0) {</div>
<div class="line"><a name="l00763"></a><span class="lineno">  763</span>&#160; </div>
<div class="line"><a name="l00764"></a><span class="lineno">  764</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l00765"></a><span class="lineno">  765</span>&#160;<span class="comment">                 * !!! JimA - We may want to call the kernel to</span></div>
<div class="line"><a name="l00766"></a><span class="lineno">  766</span>&#160;<span class="comment">                 * set TIF_SHUTDOWNCOMPLETE in this case.</span></div>
<div class="line"><a name="l00767"></a><span class="lineno">  767</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l00768"></a><span class="lineno">  768</span>&#160;                <span class="keywordflow">return</span> <a class="code" href="a03239.html#a8f11ce738c583d101e1ae328c351deac">CMDEND_USERSAYSCANCEL</a>;</div>
<div class="line"><a name="l00769"></a><span class="lineno">  769</span>&#160;            }</div>
<div class="line"><a name="l00770"></a><span class="lineno">  770</span>&#160; </div>
<div class="line"><a name="l00771"></a><span class="lineno">  771</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00772"></a><span class="lineno">  772</span>&#160;<span class="comment">             * If hung, bring up the endtask dialog right away.</span></div>
<div class="line"><a name="l00773"></a><span class="lineno">  773</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00774"></a><span class="lineno">  774</span>&#160;            dwHungApp = (fEndTask ? CMSHUNGAPPTIMEOUT : CMSWAITTOKILLTIMEOUT);</div>
<div class="line"><a name="l00775"></a><span class="lineno">  775</span>&#160;            <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00776"></a><span class="lineno">  776</span>&#160;            Status = <a class="code" href="a00362.html#a4d1853d31fa66209a2b02615f3cf1a97">NtUserQueryInformationThread</a>(pcsrt-&gt;ThreadHandle,</div>
<div class="line"><a name="l00777"></a><span class="lineno">  777</span>&#160;                    UserThreadHungStatus, &amp;dwHungApp, <span class="keyword">sizeof</span>(dwHungApp), NULL);</div>
<div class="line"><a name="l00778"></a><span class="lineno">  778</span>&#160;            <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00779"></a><span class="lineno">  779</span>&#160;            <span class="keywordflow">if</span> (!NT_SUCCESS(Status) || dwHungApp == TRUE)</div>
<div class="line"><a name="l00780"></a><span class="lineno">  780</span>&#160;                <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00781"></a><span class="lineno">  781</span>&#160; </div>
<div class="line"><a name="l00782"></a><span class="lineno">  782</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00783"></a><span class="lineno">  783</span>&#160;<span class="comment">             * Sleep for a second.</span></div>
<div class="line"><a name="l00784"></a><span class="lineno">  784</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00785"></a><span class="lineno">  785</span>&#160;            <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00786"></a><span class="lineno">  786</span>&#160;            li.QuadPart = (LONGLONG)-10000 * CMSSLEEP;</div>
<div class="line"><a name="l00787"></a><span class="lineno">  787</span>&#160;            NtDelayExecution(FALSE, &amp;li);</div>
<div class="line"><a name="l00788"></a><span class="lineno">  788</span>&#160;            <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00789"></a><span class="lineno">  789</span>&#160;        }</div>
<div class="line"><a name="l00790"></a><span class="lineno">  790</span>&#160; </div>
<div class="line"><a name="l00791"></a><span class="lineno">  791</span>&#160;        achName[0] = 0;</div>
<div class="line"><a name="l00792"></a><span class="lineno">  792</span>&#160;        <span class="keywordflow">if</span> (<a class="code" href="a03743.html#ac5ede70e870dc1cf540d7524887e4edc">IsWindow</a>(hwnd)) {</div>
<div class="line"><a name="l00793"></a><span class="lineno">  793</span>&#160;            GetWindowText(hwnd, achName, <a class="code" href="a03239.html#a7143e883c651100c3c38ffa2537c93ed">CCHMSGMAX</a>);</div>
<div class="line"><a name="l00794"></a><span class="lineno">  794</span>&#160;        }</div>
<div class="line"><a name="l00795"></a><span class="lineno">  795</span>&#160; </div>
<div class="line"><a name="l00796"></a><span class="lineno">  796</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00797"></a><span class="lineno">  797</span>&#160;<span class="comment">         * If there&#39;s a hard error, put it on top.</span></div>
<div class="line"><a name="l00798"></a><span class="lineno">  798</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00799"></a><span class="lineno">  799</span>&#160;        <a class="code" href="a03239.html#ad251c3353b8caac862bb30255af684fa">BoostHardError</a>((<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>)pcsrt-&gt;ClientId.UniqueProcess, FALSE);</div>
<div class="line"><a name="l00800"></a><span class="lineno">  800</span>&#160; </div>
<div class="line"><a name="l00801"></a><span class="lineno">  801</span>&#160;        <span class="keywordflow">if</span> (achName[0] == 0) {</div>
<div class="line"><a name="l00802"></a><span class="lineno">  802</span>&#160; </div>
<div class="line"><a name="l00803"></a><span class="lineno">  803</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00804"></a><span class="lineno">  804</span>&#160;<span class="comment">             * If the thread is gone, we&#39;re done.</span></div>
<div class="line"><a name="l00805"></a><span class="lineno">  805</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00806"></a><span class="lineno">  806</span>&#160;            <span class="keywordflow">if</span> (pcsrt-&gt;Flags &amp; CSR_THREAD_DESTROYED) {</div>
<div class="line"><a name="l00807"></a><span class="lineno">  807</span>&#160;                <span class="keywordflow">return</span> <a class="code" href="a03239.html#aab5abd3edec726f9dd6d86c33e7725c4">CMDEND_APPSAYSOK</a>;</div>
<div class="line"><a name="l00808"></a><span class="lineno">  808</span>&#160;            }</div>
<div class="line"><a name="l00809"></a><span class="lineno">  809</span>&#160; </div>
<div class="line"><a name="l00810"></a><span class="lineno">  810</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00811"></a><span class="lineno">  811</span>&#160;<span class="comment">             * pti is valid right now. Use the name in the pti.</span></div>
<div class="line"><a name="l00812"></a><span class="lineno">  812</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00813"></a><span class="lineno">  813</span>&#160;            <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00814"></a><span class="lineno">  814</span>&#160;            <a class="code" href="a00362.html#a4d1853d31fa66209a2b02615f3cf1a97">NtUserQueryInformationThread</a>(pcsrt-&gt;ThreadHandle,</div>
<div class="line"><a name="l00815"></a><span class="lineno">  815</span>&#160;                    UserThreadTaskName, achName, <a class="code" href="a03239.html#a7143e883c651100c3c38ffa2537c93ed">CCHMSGMAX</a> * <span class="keyword">sizeof</span>(WCHAR),</div>
<div class="line"><a name="l00816"></a><span class="lineno">  816</span>&#160;                    NULL);</div>
<div class="line"><a name="l00817"></a><span class="lineno">  817</span>&#160;            <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00818"></a><span class="lineno">  818</span>&#160;        }</div>
<div class="line"><a name="l00819"></a><span class="lineno">  819</span>&#160; </div>
<div class="line"><a name="l00820"></a><span class="lineno">  820</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00821"></a><span class="lineno">  821</span>&#160;<span class="comment">         * Set this thread to use the desktop of the</span></div>
<div class="line"><a name="l00822"></a><span class="lineno">  822</span>&#160;<span class="comment">         * thread being shutdown.</span></div>
<div class="line"><a name="l00823"></a><span class="lineno">  823</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00824"></a><span class="lineno">  824</span>&#160;        <span class="keywordflow">if</span> (NT_SUCCESS(<a class="code" href="a00362.html#af86a9b04196ca170fc6b6e4b4e6a5dbc">NtUserSetInformationThread</a>(NtCurrentThread(),</div>
<div class="line"><a name="l00825"></a><span class="lineno">  825</span>&#160;                UserThreadUseDesktop, &amp;pcsrt-&gt;ThreadHandle, <span class="keyword">sizeof</span>(HANDLE)))) {</div>
<div class="line"><a name="l00826"></a><span class="lineno">  826</span>&#160; </div>
<div class="line"><a name="l00827"></a><span class="lineno">  827</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00828"></a><span class="lineno">  828</span>&#160;<span class="comment">             * Bring up the dialog</span></div>
<div class="line"><a name="l00829"></a><span class="lineno">  829</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00830"></a><span class="lineno">  830</span>&#160;            dwRet = <a class="code" href="a03239.html#a6e1f93446f792e5b40d9bd6307c4430c">DoEndTaskDialog</a>(achName, pcsrt,</div>
<div class="line"><a name="l00831"></a><span class="lineno">  831</span>&#160;                                        TYPE_THREADINFO, cSeconds);</div>
<div class="line"><a name="l00832"></a><span class="lineno">  832</span>&#160; </div>
<div class="line"><a name="l00833"></a><span class="lineno">  833</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00834"></a><span class="lineno">  834</span>&#160;<span class="comment">             * Release the desktop that was used.</span></div>
<div class="line"><a name="l00835"></a><span class="lineno">  835</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00836"></a><span class="lineno">  836</span>&#160;            <a class="code" href="a00362.html#af86a9b04196ca170fc6b6e4b4e6a5dbc">NtUserSetInformationThread</a>(NtCurrentThread(), UserThreadUseDesktop,</div>
<div class="line"><a name="l00837"></a><span class="lineno">  837</span>&#160;                    &amp;hNull, <span class="keyword">sizeof</span>(HANDLE));</div>
<div class="line"><a name="l00838"></a><span class="lineno">  838</span>&#160;        } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00839"></a><span class="lineno">  839</span>&#160; </div>
<div class="line"><a name="l00840"></a><span class="lineno">  840</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00841"></a><span class="lineno">  841</span>&#160;<span class="comment">             * We were unable to get the thread&#39;s desktop.  All we</span></div>
<div class="line"><a name="l00842"></a><span class="lineno">  842</span>&#160;<span class="comment">             * can do is kill the task.</span></div>
<div class="line"><a name="l00843"></a><span class="lineno">  843</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00844"></a><span class="lineno">  844</span>&#160;            dwRet = IDABORT;</div>
<div class="line"><a name="l00845"></a><span class="lineno">  845</span>&#160;        }</div>
<div class="line"><a name="l00846"></a><span class="lineno">  846</span>&#160; </div>
<div class="line"><a name="l00847"></a><span class="lineno">  847</span>&#160;        <span class="keywordflow">switch</span>(dwRet) {</div>
<div class="line"><a name="l00848"></a><span class="lineno">  848</span>&#160;        <span class="keywordflow">case</span> IDCANCEL:</div>
<div class="line"><a name="l00849"></a><span class="lineno">  849</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00850"></a><span class="lineno">  850</span>&#160;<span class="comment">             * Cancel the shutdown process... Get out of here. Signify that</span></div>
<div class="line"><a name="l00851"></a><span class="lineno">  851</span>&#160;<span class="comment">             * we&#39;re cancelling the shutdown request.</span></div>
<div class="line"><a name="l00852"></a><span class="lineno">  852</span>&#160;<span class="comment">             *</span></div>
<div class="line"><a name="l00853"></a><span class="lineno">  853</span>&#160;<span class="comment">             * !!! JimA - We may want to call the kernel to</span></div>
<div class="line"><a name="l00854"></a><span class="lineno">  854</span>&#160;<span class="comment">             * set TIF_SHUTDOWNCOMPLETE in this case.</span></div>
<div class="line"><a name="l00855"></a><span class="lineno">  855</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00856"></a><span class="lineno">  856</span>&#160;            <span class="keywordflow">return</span> <a class="code" href="a03239.html#a8f11ce738c583d101e1ae328c351deac">CMDEND_USERSAYSCANCEL</a>;</div>
<div class="line"><a name="l00857"></a><span class="lineno">  857</span>&#160;            <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00858"></a><span class="lineno">  858</span>&#160; </div>
<div class="line"><a name="l00859"></a><span class="lineno">  859</span>&#160;        <span class="keywordflow">case</span> IDABORT:</div>
<div class="line"><a name="l00860"></a><span class="lineno">  860</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00861"></a><span class="lineno">  861</span>&#160;<span class="comment">             * End this guy&#39;s task...</span></div>
<div class="line"><a name="l00862"></a><span class="lineno">  862</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00863"></a><span class="lineno">  863</span>&#160;            <a class="code" href="a03239.html#ad251c3353b8caac862bb30255af684fa">BoostHardError</a>((<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>)pcsrt-&gt;ClientId.UniqueProcess, TRUE);</div>
<div class="line"><a name="l00864"></a><span class="lineno">  864</span>&#160; </div>
<div class="line"><a name="l00865"></a><span class="lineno">  865</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00866"></a><span class="lineno">  866</span>&#160;<span class="comment">             * !!! JimA - We may want to call the kernel to</span></div>
<div class="line"><a name="l00867"></a><span class="lineno">  867</span>&#160;<span class="comment">             * set TIF_SHUTDOWNCOMPLETE in this case.</span></div>
<div class="line"><a name="l00868"></a><span class="lineno">  868</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00869"></a><span class="lineno">  869</span>&#160;            <span class="keywordflow">return</span> <a class="code" href="a03239.html#ad66fd118ce776a77cb84fad3ad8cbd29">CMDEND_USERSAYSKILL</a>;</div>
<div class="line"><a name="l00870"></a><span class="lineno">  870</span>&#160;            <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00871"></a><span class="lineno">  871</span>&#160; </div>
<div class="line"><a name="l00872"></a><span class="lineno">  872</span>&#160;        <span class="keywordflow">case</span> IDRETRY:</div>
<div class="line"><a name="l00873"></a><span class="lineno">  873</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00874"></a><span class="lineno">  874</span>&#160;<span class="comment">             * Just continue to wait. Reset this app so it doesn&#39;t think it&#39;s</span></div>
<div class="line"><a name="l00875"></a><span class="lineno">  875</span>&#160;<span class="comment">             * hung. This&#39;ll cause us to wait again.</span></div>
<div class="line"><a name="l00876"></a><span class="lineno">  876</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00877"></a><span class="lineno">  877</span>&#160;            <span class="keywordflow">if</span> (!(pcsrt-&gt;Flags &amp; CSR_THREAD_DESTROYED)) {</div>
<div class="line"><a name="l00878"></a><span class="lineno">  878</span>&#160;                <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00879"></a><span class="lineno">  879</span>&#160;                <a class="code" href="a00362.html#af86a9b04196ca170fc6b6e4b4e6a5dbc">NtUserSetInformationThread</a>(pcsrt-&gt;ThreadHandle,</div>
<div class="line"><a name="l00880"></a><span class="lineno">  880</span>&#160;                        UserThreadHungStatus, NULL, 0);</div>
<div class="line"><a name="l00881"></a><span class="lineno">  881</span>&#160;                <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00882"></a><span class="lineno">  882</span>&#160;            }</div>
<div class="line"><a name="l00883"></a><span class="lineno">  883</span>&#160;            fPostedClose = FALSE;</div>
<div class="line"><a name="l00884"></a><span class="lineno">  884</span>&#160;            <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00885"></a><span class="lineno">  885</span>&#160;        }</div>
<div class="line"><a name="l00886"></a><span class="lineno">  886</span>&#160;    }</div>
<div class="line"><a name="l00887"></a><span class="lineno">  887</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a00947_source.html#l01464">BoostHardError()</a>, <a class="el" href="a03239_source.html#l00042">CCHBODYMAX</a>, <a class="el" href="a03239_source.html#l00041">CCHMSGMAX</a>, <a class="el" href="a03239_source.html#l00036">CMDEND_APPSAYSNOTOK</a>, <a class="el" href="a03239_source.html#l00035">CMDEND_APPSAYSOK</a>, <a class="el" href="a03239_source.html#l00038">CMDEND_USERSAYSCANCEL</a>, <a class="el" href="a03239_source.html#l00037">CMDEND_USERSAYSKILL</a>, <a class="el" href="a03239_source.html#l01016">DoEndTaskDialog()</a>, <a class="el" href="a00563_source.html#l00175">DWORD</a>, <a class="el" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit()</a>, <a class="el" href="a03743_source.html#l00466">GetWindow()</a>, <a class="el" href="a03260_source.html#l00027">heventCancel</a>, <a class="el" href="a03743_source.html#l00421">IsWindow()</a>, <a class="el" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit()</a>, <a class="el" href="a03614_source.html#l06006">NtUserQueryInformationThread()</a>, <a class="el" href="a03614_source.html#l06050">NtUserSetInformationThread()</a>, <a class="el" href="a00356_source.html#l00471">PostMessage()</a>, <a class="el" href="a00356_source.html#l00957">SendNotifyMessage()</a> , 以及 <a class="el" href="a00026_source.html#l02960">SetForegroundWindow()</a>.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l01055">_EndTask()</a> , 以及 <a class="el" href="a03239_source.html#l00572">SendShutdownMessages()</a>.</p>

</div>
</div>
<a id="a1235d4adf091dd34cf85292008e10212"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a1235d4adf091dd34cf85292008e10212">&#9670;&nbsp;</a></span>SendShutdownMessages()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> SendShutdownMessages </td>
          <td>(</td>
          <td class="paramtype">HWND&#160;</td>
          <td class="paramname"><em>hwndDesktop</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">PCSR_THREAD&#160;</td>
          <td class="paramname"><em>pcsrt</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>&#160;</td>
          <td class="paramname"><em>dwClientFlags</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00572">572</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l00576"></a><span class="lineno">  576</span>&#160;{</div>
<div class="line"><a name="l00577"></a><span class="lineno">  577</span>&#160;    HWND hwnd;</div>
<div class="line"><a name="l00578"></a><span class="lineno">  578</span>&#160;    <a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> cmd;</div>
<div class="line"><a name="l00579"></a><span class="lineno">  579</span>&#160; </div>
<div class="line"><a name="l00580"></a><span class="lineno">  580</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00581"></a><span class="lineno">  581</span>&#160;<span class="comment">     * Find a top-level window owned by the thread.</span></div>
<div class="line"><a name="l00582"></a><span class="lineno">  582</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00583"></a><span class="lineno">  583</span>&#160;    hwnd = NULL;</div>
<div class="line"><a name="l00584"></a><span class="lineno">  584</span>&#160;    <a class="code" href="a00017.html#a24afbf4ddb86fdedeb15a6b679902e71">EnumThreadWindows</a>((<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>)pcsrt-&gt;ClientId.UniqueThread,</div>
<div class="line"><a name="l00585"></a><span class="lineno">  585</span>&#160;                        &amp;<a class="code" href="a03239.html#aadc5a0499586d2b3c2ce8b850dc53abd">FindWindowFromThread</a>, (LPARAM)&amp;hwnd);</div>
<div class="line"><a name="l00586"></a><span class="lineno">  586</span>&#160;    <span class="keywordflow">if</span> (!hwnd)</div>
<div class="line"><a name="l00587"></a><span class="lineno">  587</span>&#160;        <span class="keywordflow">return</span> <a class="code" href="a03239.html#aac6a5a74395a61a33c29e0478eb13945">CMDEND_NOWINDOW</a>;</div>
<div class="line"><a name="l00588"></a><span class="lineno">  588</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00589"></a><span class="lineno">  589</span>&#160;<span class="comment">     * This&#39;ll send WM_QUERYENDSESSION / WM_ENDSESSION messages to all</span></div>
<div class="line"><a name="l00590"></a><span class="lineno">  590</span>&#160;<span class="comment">     * the windows of this hwnd&#39;s thread.</span></div>
<div class="line"><a name="l00591"></a><span class="lineno">  591</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00592"></a><span class="lineno">  592</span>&#160;    cmd = <a class="code" href="a03239.html#adaea996c1b105ea7798e9b4763cb7135">MySendEndSessionMessages</a>(hwnd, pcsrt, FALSE, dwClientFlags);</div>
<div class="line"><a name="l00593"></a><span class="lineno">  593</span>&#160; </div>
<div class="line"><a name="l00594"></a><span class="lineno">  594</span>&#160;    <span class="keywordflow">switch</span> (cmd) {</div>
<div class="line"><a name="l00595"></a><span class="lineno">  595</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="a03239.html#aab5abd3edec726f9dd6d86c33e7725c4">CMDEND_APPSAYSOK</a>:</div>
<div class="line"><a name="l00596"></a><span class="lineno">  596</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00597"></a><span class="lineno">  597</span>&#160;<span class="comment">         * This thread says ok... continue on to the next thread.</span></div>
<div class="line"><a name="l00598"></a><span class="lineno">  598</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00599"></a><span class="lineno">  599</span>&#160;        <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00600"></a><span class="lineno">  600</span>&#160; </div>
<div class="line"><a name="l00601"></a><span class="lineno">  601</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="a03239.html#ad66fd118ce776a77cb84fad3ad8cbd29">CMDEND_USERSAYSKILL</a>:</div>
<div class="line"><a name="l00602"></a><span class="lineno">  602</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00603"></a><span class="lineno">  603</span>&#160;<span class="comment">         * The user hit the &quot;end-task&quot; button on the hung app dialog.</span></div>
<div class="line"><a name="l00604"></a><span class="lineno">  604</span>&#160;<span class="comment">         * If this is a wow app, kill just this app and continue to</span></div>
<div class="line"><a name="l00605"></a><span class="lineno">  605</span>&#160;<span class="comment">         * the next wow app.</span></div>
<div class="line"><a name="l00606"></a><span class="lineno">  606</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00607"></a><span class="lineno">  607</span>&#160;        <span class="keywordflow">if</span> (!(pcsrt-&gt;Flags &amp; CSR_THREAD_DESTROYED)) {</div>
<div class="line"><a name="l00608"></a><span class="lineno">  608</span>&#160;            <span class="keywordflow">if</span> (<a class="code" href="a03239.html#a4c3e71728419b51abac3cd3731c7891d">WowExitTask</a>(pcsrt))</div>
<div class="line"><a name="l00609"></a><span class="lineno">  609</span>&#160;                <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00610"></a><span class="lineno">  610</span>&#160;        }</div>
<div class="line"><a name="l00611"></a><span class="lineno">  611</span>&#160; </div>
<div class="line"><a name="l00612"></a><span class="lineno">  612</span>&#160;        <span class="comment">/* otherwise fall through */</span></div>
<div class="line"><a name="l00613"></a><span class="lineno">  613</span>&#160; </div>
<div class="line"><a name="l00614"></a><span class="lineno">  614</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="a03239.html#a8f11ce738c583d101e1ae328c351deac">CMDEND_USERSAYSCANCEL</a>:</div>
<div class="line"><a name="l00615"></a><span class="lineno">  615</span>&#160;    <span class="keywordflow">case</span> <a class="code" href="a03239.html#ad213141f4fe1fd382bc14446b8e021c5">CMDEND_APPSAYSNOTOK</a>:</div>
<div class="line"><a name="l00616"></a><span class="lineno">  616</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00617"></a><span class="lineno">  617</span>&#160;<span class="comment">         * Exit out of here... either the user wants to kill or cancel,</span></div>
<div class="line"><a name="l00618"></a><span class="lineno">  618</span>&#160;<span class="comment">         * or the app says no.</span></div>
<div class="line"><a name="l00619"></a><span class="lineno">  619</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00620"></a><span class="lineno">  620</span>&#160;        <span class="keywordflow">return</span> cmd;</div>
<div class="line"><a name="l00621"></a><span class="lineno">  621</span>&#160;    }</div>
<div class="line"><a name="l00622"></a><span class="lineno">  622</span>&#160; </div>
<div class="line"><a name="l00623"></a><span class="lineno">  623</span>&#160;    <span class="keywordflow">return</span> <a class="code" href="a03239.html#aab5abd3edec726f9dd6d86c33e7725c4">CMDEND_APPSAYSOK</a>;</div>
<div class="line"><a name="l00624"></a><span class="lineno">  624</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a03239_source.html#l00036">CMDEND_APPSAYSNOTOK</a>, <a class="el" href="a03239_source.html#l00035">CMDEND_APPSAYSOK</a>, <a class="el" href="a03239_source.html#l00039">CMDEND_NOWINDOW</a>, <a class="el" href="a03239_source.html#l00038">CMDEND_USERSAYSCANCEL</a>, <a class="el" href="a03239_source.html#l00037">CMDEND_USERSAYSKILL</a>, <a class="el" href="a00563_source.html#l00175">DWORD</a>, <a class="el" href="a00017_source.html#l00070">EnumThreadWindows()</a>, <a class="el" href="a03239_source.html#l00558">FindWindowFromThread()</a>, <a class="el" href="a03239_source.html#l00634">MySendEndSessionMessages()</a> , 以及 <a class="el" href="a03239_source.html#l01188">WowExitTask()</a>.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l00224">UserClientShutdown()</a>.</p>

</div>
</div>
<a id="a4ab8c3384e56e567d12c5017cb23d5e4"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4ab8c3384e56e567d12c5017cb23d5e4">&#9670;&nbsp;</a></span>SrvEndTask()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">ULONG SrvEndTask </td>
          <td>(</td>
          <td class="paramtype">IN OUT PCSR_API_MSG&#160;</td>
          <td class="paramname"><em>m</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">IN OUT PCSR_REPLY_STATUS&#160;</td>
          <td class="paramname"><em>ReplyStatus</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l01405">1405</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l01408"></a><span class="lineno"> 1408</span>&#160;{</div>
<div class="line"><a name="l01409"></a><span class="lineno"> 1409</span>&#160;    <a class="code" href="a03239.html#a72f325200de1f3aabe8bf31e2f7fad87">BEGIN_LPC_RECV</a>(ENDTASK);</div>
<div class="line"><a name="l01410"></a><span class="lineno"> 1410</span>&#160; </div>
<div class="line"><a name="l01411"></a><span class="lineno"> 1411</span>&#160;    a-&gt;fSuccess = <a class="code" href="a03239.html#af72b486135dd980945ed91746e345a8a">_EndTask</a>(</div>
<div class="line"><a name="l01412"></a><span class="lineno"> 1412</span>&#160;        a-&gt;hwnd,</div>
<div class="line"><a name="l01413"></a><span class="lineno"> 1413</span>&#160;        a-&gt;fShutdown,</div>
<div class="line"><a name="l01414"></a><span class="lineno"> 1414</span>&#160;        a-&gt;fForce);</div>
<div class="line"><a name="l01415"></a><span class="lineno"> 1415</span>&#160; </div>
<div class="line"><a name="l01416"></a><span class="lineno"> 1416</span>&#160;    <a class="code" href="a03239.html#a7348244df100929b2981aeaf0f9f9ea0">END_LPC_RECV</a>();</div>
<div class="line"><a name="l01417"></a><span class="lineno"> 1417</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a03239_source.html#l01055">_EndTask()</a>, <a class="el" href="a03239_source.html#l00016">BEGIN_LPC_RECV</a> , 以及 <a class="el" href="a03239_source.html#l00027">END_LPC_RECV</a>.</p>

</div>
</div>
<a id="a4a81b319fb6b75f5ef48ab1746f5f39c"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4a81b319fb6b75f5ef48ab1746f5f39c">&#9670;&nbsp;</a></span>SrvExitWindowsEx()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">ULONG SrvExitWindowsEx </td>
          <td>(</td>
          <td class="paramtype">IN OUT PCSR_API_MSG&#160;</td>
          <td class="paramname"><em>m</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">IN OUT PCSR_REPLY_STATUS&#160;</td>
          <td class="paramname"><em>ReplyStatus</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l01392">1392</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l01395"></a><span class="lineno"> 1395</span>&#160;{</div>
<div class="line"><a name="l01396"></a><span class="lineno"> 1396</span>&#160;    <a class="code" href="a03239.html#a72f325200de1f3aabe8bf31e2f7fad87">BEGIN_LPC_RECV</a>(EXITWINDOWSEX);</div>
<div class="line"><a name="l01397"></a><span class="lineno"> 1397</span>&#160; </div>
<div class="line"><a name="l01398"></a><span class="lineno"> 1398</span>&#160;    Status = <a class="code" href="a03239.html#aa4be6119fd72c33b7a4a76bf7a72762c">_ExitWindowsEx</a>(pcsrt, a-&gt;uFlags, a-&gt;dwReserved);</div>
<div class="line"><a name="l01399"></a><span class="lineno"> 1399</span>&#160;    a-&gt;fSuccess = NT_SUCCESS(Status);</div>
<div class="line"><a name="l01400"></a><span class="lineno"> 1400</span>&#160; </div>
<div class="line"><a name="l01401"></a><span class="lineno"> 1401</span>&#160;    <a class="code" href="a03239.html#a7348244df100929b2981aeaf0f9f9ea0">END_LPC_RECV</a>();</div>
<div class="line"><a name="l01402"></a><span class="lineno"> 1402</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a03239_source.html#l00068">_ExitWindowsEx()</a>, <a class="el" href="a03239_source.html#l00016">BEGIN_LPC_RECV</a> , 以及 <a class="el" href="a03239_source.html#l00027">END_LPC_RECV</a>.</p>

</div>
</div>
<a id="aaff0cdc89a60177fe38e42ec397b9606"></a>
<h2 class="memtitle"><span class="permalink"><a href="#aaff0cdc89a60177fe38e42ec397b9606">&#9670;&nbsp;</a></span>SrvRegisterServicesProcess()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">ULONG SrvRegisterServicesProcess </td>
          <td>(</td>
          <td class="paramtype">IN OUT PCSR_API_MSG&#160;</td>
          <td class="paramname"><em>m</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">IN OUT PCSR_REPLY_STATUS&#160;</td>
          <td class="paramname"><em>ReplyStatus</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l01480">1480</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l01483"></a><span class="lineno"> 1483</span>&#160;{</div>
<div class="line"><a name="l01484"></a><span class="lineno"> 1484</span>&#160;    PRIVILEGE_SET <a class="code" href="a03266.html#a515921616ee307c5862eb0be3a8e7c1e">psTcb</a> = { 1, PRIVILEGE_SET_ALL_NECESSARY,</div>
<div class="line"><a name="l01485"></a><span class="lineno"> 1485</span>&#160;        { SE_TCB_PRIVILEGE, 0 }</div>
<div class="line"><a name="l01486"></a><span class="lineno"> 1486</span>&#160;    };</div>
<div class="line"><a name="l01487"></a><span class="lineno"> 1487</span>&#160; </div>
<div class="line"><a name="l01488"></a><span class="lineno"> 1488</span>&#160;    <a class="code" href="a03239.html#a72f325200de1f3aabe8bf31e2f7fad87">BEGIN_LPC_RECV</a>(REGISTERSERVICESPROCESS);</div>
<div class="line"><a name="l01489"></a><span class="lineno"> 1489</span>&#160; </div>
<div class="line"><a name="l01490"></a><span class="lineno"> 1490</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01491"></a><span class="lineno"> 1491</span>&#160;<span class="comment">     * Allow only one services process and then only if it has TCB</span></div>
<div class="line"><a name="l01492"></a><span class="lineno"> 1492</span>&#160;<span class="comment">     * privilege.</span></div>
<div class="line"><a name="l01493"></a><span class="lineno"> 1493</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01494"></a><span class="lineno"> 1494</span>&#160;    <span class="keywordflow">if</span> (<a class="code" href="a03260.html#ae6e524b3fef38672dd5c9316ed526bf7">gdwServicesProcessId</a> != 0 || !<a class="code" href="a03239.html#ad5164087ca1b77435e44c75a73c0538f">IsPrivileged</a>(&amp;<a class="code" href="a03266.html#a515921616ee307c5862eb0be3a8e7c1e">psTcb</a>)) {</div>
<div class="line"><a name="l01495"></a><span class="lineno"> 1495</span>&#160;        SetLastError(ERROR_ACCESS_DENIED);</div>
<div class="line"><a name="l01496"></a><span class="lineno"> 1496</span>&#160;        a-&gt;fSuccess = FALSE;</div>
<div class="line"><a name="l01497"></a><span class="lineno"> 1497</span>&#160;    } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l01498"></a><span class="lineno"> 1498</span>&#160;        <a class="code" href="a03260.html#ae6e524b3fef38672dd5c9316ed526bf7">gdwServicesProcessId</a> = a-&gt;dwProcessId;</div>
<div class="line"><a name="l01499"></a><span class="lineno"> 1499</span>&#160;        a-&gt;fSuccess = TRUE;</div>
<div class="line"><a name="l01500"></a><span class="lineno"> 1500</span>&#160;    }</div>
<div class="line"><a name="l01501"></a><span class="lineno"> 1501</span>&#160; </div>
<div class="line"><a name="l01502"></a><span class="lineno"> 1502</span>&#160;    <a class="code" href="a03239.html#a7348244df100929b2981aeaf0f9f9ea0">END_LPC_RECV</a>();</div>
<div class="line"><a name="l01503"></a><span class="lineno"> 1503</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a03239_source.html#l00016">BEGIN_LPC_RECV</a>, <a class="el" href="a03239_source.html#l00027">END_LPC_RECV</a>, <a class="el" href="a03260_source.html#l00039">gdwServicesProcessId</a>, <a class="el" href="a03239_source.html#l01428">IsPrivileged()</a> , 以及 <a class="el" href="a00839_source.html#l00022">psTcb</a>.</p>

</div>
</div>
<a id="a42d30cf3c3824180520a83ce6c62aeeb"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a42d30cf3c3824180520a83ce6c62aeeb">&#9670;&nbsp;</a></span>UserClientShutdown()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">NTSTATUS UserClientShutdown </td>
          <td>(</td>
          <td class="paramtype">PCSR_PROCESS&#160;</td>
          <td class="paramname"><em>pcsrp</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">ULONG&#160;</td>
          <td class="paramname"><em>dwFlags</em>, </td>
        </tr>
        <tr>
          <td class="paramkey"></td>
          <td></td>
          <td class="paramtype">BOOLEAN&#160;</td>
          <td class="paramname"><em>fFirstPass</em>&#160;</td>
        </tr>
        <tr>
          <td></td>
          <td>)</td>
          <td></td><td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00224">224</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l00228"></a><span class="lineno">  228</span>&#160;{</div>
<div class="line"><a name="l00229"></a><span class="lineno">  229</span>&#160;    PLIST_ENTRY ListHead, ListNext;</div>
<div class="line"><a name="l00230"></a><span class="lineno">  230</span>&#160;    PCSR_PROCESS Process;</div>
<div class="line"><a name="l00231"></a><span class="lineno">  231</span>&#160;    PCSR_THREAD Thread;</div>
<div class="line"><a name="l00232"></a><span class="lineno">  232</span>&#160;    USERTHREAD_SHUTDOWN_INFORMATION ShutdownInfo;</div>
<div class="line"><a name="l00233"></a><span class="lineno">  233</span>&#160;    BOOL fNoRetry;</div>
<div class="line"><a name="l00234"></a><span class="lineno">  234</span>&#160;    <a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> cmd, dwClientFlags;</div>
<div class="line"><a name="l00235"></a><span class="lineno">  235</span>&#160;    NTSTATUS Status;</div>
<div class="line"><a name="l00236"></a><span class="lineno">  236</span>&#160;    <a class="code" href="a03608.html#afd1a0e78d1f88954d93e48ab3821781f">UINT</a> cThreads;</div>
<div class="line"><a name="l00237"></a><span class="lineno">  237</span>&#160;    BOOL fSendEndSession = FALSE;</div>
<div class="line"><a name="l00238"></a><span class="lineno">  238</span>&#160; </div>
<div class="line"><a name="l00239"></a><span class="lineno">  239</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00240"></a><span class="lineno">  240</span>&#160;<span class="comment">     * If this is a logoff and the process does not belong to</span></div>
<div class="line"><a name="l00241"></a><span class="lineno">  241</span>&#160;<span class="comment">     * the account doing the logoff and is not LocalSystem,</span></div>
<div class="line"><a name="l00242"></a><span class="lineno">  242</span>&#160;<span class="comment">     * do not send end-session messages.  Console will notify</span></div>
<div class="line"><a name="l00243"></a><span class="lineno">  243</span>&#160;<span class="comment">     * the app of the logoff.</span></div>
<div class="line"><a name="l00244"></a><span class="lineno">  244</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00245"></a><span class="lineno">  245</span>&#160;    <span class="keywordflow">if</span> (!(dwFlags &amp; EWX_SHUTDOWN) &amp;&amp; (pcsrp-&gt;ShutdownFlags &amp; SHUTDOWN_OTHERCONTEXT))</div>
<div class="line"><a name="l00246"></a><span class="lineno">  246</span>&#160;        <span class="keywordflow">return</span> SHUTDOWN_UNKNOWN_PROCESS;</div>
<div class="line"><a name="l00247"></a><span class="lineno">  247</span>&#160; </div>
<div class="line"><a name="l00248"></a><span class="lineno">  248</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00249"></a><span class="lineno">  249</span>&#160;<span class="comment">     * Calculate whether to allow exit and force-exit this process before</span></div>
<div class="line"><a name="l00250"></a><span class="lineno">  250</span>&#160;<span class="comment">     * we unlock pcsrp.</span></div>
<div class="line"><a name="l00251"></a><span class="lineno">  251</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00252"></a><span class="lineno">  252</span>&#160;    fNoRetry = (pcsrp-&gt;ShutdownFlags &amp; SHUTDOWN_NORETRY) ||</div>
<div class="line"><a name="l00253"></a><span class="lineno">  253</span>&#160;            (dwFlags &amp; EWX_FORCE);</div>
<div class="line"><a name="l00254"></a><span class="lineno">  254</span>&#160; </div>
<div class="line"><a name="l00255"></a><span class="lineno">  255</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00256"></a><span class="lineno">  256</span>&#160;<span class="comment">     * Setup flags for WM_CLIENTSHUTDOWN</span></div>
<div class="line"><a name="l00257"></a><span class="lineno">  257</span>&#160;<span class="comment">     * -Assume the process is going to OK the WM_QUERYENDSESSION (WMCS_EXIT)</span></div>
<div class="line"><a name="l00258"></a><span class="lineno">  258</span>&#160;<span class="comment">     * -NT&#39;s shutdown always starts with a logoff.</span></div>
<div class="line"><a name="l00259"></a><span class="lineno">  259</span>&#160;<span class="comment">     * -Shutdown or logoff? (WMCS_SHUTDOWN)</span></div>
<div class="line"><a name="l00260"></a><span class="lineno">  260</span>&#160;<span class="comment">     * -is this process in the context being logged off? (WMCS_CONTEXTLOGOFF)</span></div>
<div class="line"><a name="l00261"></a><span class="lineno">  261</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00262"></a><span class="lineno">  262</span>&#160;    dwClientFlags = WMCS_EXIT | WMCS_LOGOFF;</div>
<div class="line"><a name="l00263"></a><span class="lineno">  263</span>&#160;    <span class="keywordflow">if</span> (dwFlags &amp; EWX_SHUTDOWN) {</div>
<div class="line"><a name="l00264"></a><span class="lineno">  264</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00265"></a><span class="lineno">  265</span>&#160;<span class="comment">         * Apps will never see this set because shutdown starts with a logoff;</span></div>
<div class="line"><a name="l00266"></a><span class="lineno">  266</span>&#160;<span class="comment">         * later the actual shutdown uses EWX_FORCE so WM_CLIENTSHUTDOWN is not sent.</span></div>
<div class="line"><a name="l00267"></a><span class="lineno">  267</span>&#160;<span class="comment">         * If we need apps to see this when we&#39;re about to shutdown, then we should</span></div>
<div class="line"><a name="l00268"></a><span class="lineno">  268</span>&#160;<span class="comment">         * check for (dwFlags &amp; (EWX_WINLOGON_OLD_REBOOT | EWX_WINLOGON_OLD_SHUTDOWN))</span></div>
<div class="line"><a name="l00269"></a><span class="lineno">  269</span>&#160;<span class="comment">         * (EWX_WINLOGON_OLD_* corresponds to the original request)</span></div>
<div class="line"><a name="l00270"></a><span class="lineno">  270</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00271"></a><span class="lineno">  271</span>&#160;        dwClientFlags |= WMCS_SHUTDOWN;</div>
<div class="line"><a name="l00272"></a><span class="lineno">  272</span>&#160;    }</div>
<div class="line"><a name="l00273"></a><span class="lineno">  273</span>&#160;    <span class="keywordflow">if</span> (!(pcsrp-&gt;ShutdownFlags &amp; (SHUTDOWN_SYSTEMCONTEXT | SHUTDOWN_OTHERCONTEXT))) {</div>
<div class="line"><a name="l00274"></a><span class="lineno">  274</span>&#160;        dwClientFlags |= WMCS_CONTEXTLOGOFF;</div>
<div class="line"><a name="l00275"></a><span class="lineno">  275</span>&#160;    }</div>
<div class="line"><a name="l00276"></a><span class="lineno">  276</span>&#160; </div>
<div class="line"><a name="l00277"></a><span class="lineno">  277</span>&#160; </div>
<div class="line"><a name="l00278"></a><span class="lineno">  278</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00279"></a><span class="lineno">  279</span>&#160;<span class="comment">     * Lock the process while we walk the thread list.  We know</span></div>
<div class="line"><a name="l00280"></a><span class="lineno">  280</span>&#160;<span class="comment">     * that the process is valid and therefore do not need to</span></div>
<div class="line"><a name="l00281"></a><span class="lineno">  281</span>&#160;<span class="comment">     * check the return status.</span></div>
<div class="line"><a name="l00282"></a><span class="lineno">  282</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00283"></a><span class="lineno">  283</span>&#160;    CsrLockProcessByClientId(pcsrp-&gt;ClientId.UniqueProcess, &amp;Process);</div>
<div class="line"><a name="l00284"></a><span class="lineno">  284</span>&#160; </div>
<div class="line"><a name="l00285"></a><span class="lineno">  285</span>&#160;    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00286"></a><span class="lineno">  286</span>&#160; </div>
<div class="line"><a name="l00287"></a><span class="lineno">  287</span>&#160;    ShutdownInfo.StatusShutdown = SHUTDOWN_UNKNOWN_PROCESS;</div>
<div class="line"><a name="l00288"></a><span class="lineno">  288</span>&#160; </div>
<div class="line"><a name="l00289"></a><span class="lineno">  289</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00290"></a><span class="lineno">  290</span>&#160;<span class="comment">     * Go through the thread list and mark them as not</span></div>
<div class="line"><a name="l00291"></a><span class="lineno">  291</span>&#160;<span class="comment">     * shutdown yet.</span></div>
<div class="line"><a name="l00292"></a><span class="lineno">  292</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00293"></a><span class="lineno">  293</span>&#160;    ListHead = &amp;pcsrp-&gt;ThreadList;</div>
<div class="line"><a name="l00294"></a><span class="lineno">  294</span>&#160;    ListNext = ListHead-&gt;Flink;</div>
<div class="line"><a name="l00295"></a><span class="lineno">  295</span>&#160;    <span class="keywordflow">while</span> (ListNext != ListHead) {</div>
<div class="line"><a name="l00296"></a><span class="lineno">  296</span>&#160;        Thread = CONTAINING_RECORD( ListNext, CSR_THREAD, Link );</div>
<div class="line"><a name="l00297"></a><span class="lineno">  297</span>&#160;        Thread-&gt;Flags &amp;= ~<a class="code" href="a03239.html#af69e84f5b4d6cc1a962ef7adb4848836">CSR_THREAD_SHUTDOWNSKIP</a>;</div>
<div class="line"><a name="l00298"></a><span class="lineno">  298</span>&#160;        ListNext = ListNext-&gt;Flink;</div>
<div class="line"><a name="l00299"></a><span class="lineno">  299</span>&#160;    }</div>
<div class="line"><a name="l00300"></a><span class="lineno">  300</span>&#160; </div>
<div class="line"><a name="l00301"></a><span class="lineno">  301</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00302"></a><span class="lineno">  302</span>&#160;<span class="comment">     * Perform the proper shutdown operation on each thread.  Keep</span></div>
<div class="line"><a name="l00303"></a><span class="lineno">  303</span>&#160;<span class="comment">     * a count of the number of gui threads found.</span></div>
<div class="line"><a name="l00304"></a><span class="lineno">  304</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00305"></a><span class="lineno">  305</span>&#160;    cThreads = 0;</div>
<div class="line"><a name="l00306"></a><span class="lineno">  306</span>&#160;    <span class="keywordflow">while</span> (TRUE) {</div>
<div class="line"><a name="l00307"></a><span class="lineno">  307</span>&#160;        ListNext = ListHead-&gt;Flink;</div>
<div class="line"><a name="l00308"></a><span class="lineno">  308</span>&#160;        <span class="keywordflow">while</span> (ListNext != ListHead) {</div>
<div class="line"><a name="l00309"></a><span class="lineno">  309</span>&#160;            Thread = CONTAINING_RECORD( ListNext, CSR_THREAD, Link );</div>
<div class="line"><a name="l00310"></a><span class="lineno">  310</span>&#160; </div>
<div class="line"><a name="l00311"></a><span class="lineno">  311</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00312"></a><span class="lineno">  312</span>&#160;<span class="comment">             * Skip the thread doing the shutdown.  Assume that it&#39;s</span></div>
<div class="line"><a name="l00313"></a><span class="lineno">  313</span>&#160;<span class="comment">             * ready.</span></div>
<div class="line"><a name="l00314"></a><span class="lineno">  314</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00315"></a><span class="lineno">  315</span>&#160;            <span class="keywordflow">if</span> (Thread-&gt;ClientId.UniqueThread == (HANDLE)<a class="code" href="a03257.html#a8cebae587f0400eeadc0969475554a1b">dwThreadEndSession</a>)</div>
<div class="line"><a name="l00316"></a><span class="lineno">  316</span>&#160;                Thread-&gt;Flags |= <a class="code" href="a03239.html#af69e84f5b4d6cc1a962ef7adb4848836">CSR_THREAD_SHUTDOWNSKIP</a>;</div>
<div class="line"><a name="l00317"></a><span class="lineno">  317</span>&#160; </div>
<div class="line"><a name="l00318"></a><span class="lineno">  318</span>&#160;            <span class="keywordflow">if</span> (!(Thread-&gt;Flags &amp;</div>
<div class="line"><a name="l00319"></a><span class="lineno">  319</span>&#160;                    (CSR_THREAD_DESTROYED | <a class="code" href="a03239.html#af69e84f5b4d6cc1a962ef7adb4848836">CSR_THREAD_SHUTDOWNSKIP</a>))) {</div>
<div class="line"><a name="l00320"></a><span class="lineno">  320</span>&#160;                <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00321"></a><span class="lineno">  321</span>&#160;            }</div>
<div class="line"><a name="l00322"></a><span class="lineno">  322</span>&#160;            ListNext = ListNext-&gt;Flink;</div>
<div class="line"><a name="l00323"></a><span class="lineno">  323</span>&#160;        }</div>
<div class="line"><a name="l00324"></a><span class="lineno">  324</span>&#160;        <span class="keywordflow">if</span> (ListNext == ListHead)</div>
<div class="line"><a name="l00325"></a><span class="lineno">  325</span>&#160;            <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00326"></a><span class="lineno">  326</span>&#160; </div>
<div class="line"><a name="l00327"></a><span class="lineno">  327</span>&#160;        Thread-&gt;Flags |= <a class="code" href="a03239.html#af69e84f5b4d6cc1a962ef7adb4848836">CSR_THREAD_SHUTDOWNSKIP</a>;</div>
<div class="line"><a name="l00328"></a><span class="lineno">  328</span>&#160;        <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00329"></a><span class="lineno">  329</span>&#160;        Status = <a class="code" href="a00362.html#a4d1853d31fa66209a2b02615f3cf1a97">NtUserQueryInformationThread</a>(Thread-&gt;ThreadHandle,</div>
<div class="line"><a name="l00330"></a><span class="lineno">  330</span>&#160;                UserThreadShutdownInformation, &amp;ShutdownInfo, <span class="keyword">sizeof</span>(ShutdownInfo), NULL);</div>
<div class="line"><a name="l00331"></a><span class="lineno">  331</span>&#160;        <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00332"></a><span class="lineno">  332</span>&#160;        <span class="keywordflow">if</span> (!NT_SUCCESS(Status))</div>
<div class="line"><a name="l00333"></a><span class="lineno">  333</span>&#160;            <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00334"></a><span class="lineno">  334</span>&#160;        <span class="keywordflow">if</span> (ShutdownInfo.StatusShutdown == SHUTDOWN_UNKNOWN_PROCESS)</div>
<div class="line"><a name="l00335"></a><span class="lineno">  335</span>&#160;            <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00336"></a><span class="lineno">  336</span>&#160;        <span class="keywordflow">if</span> (ShutdownInfo.StatusShutdown == SHUTDOWN_KNOWN_PROCESS) {</div>
<div class="line"><a name="l00337"></a><span class="lineno">  337</span>&#160;            CsrUnlockProcess(Process);</div>
<div class="line"><a name="l00338"></a><span class="lineno">  338</span>&#160;            <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00339"></a><span class="lineno">  339</span>&#160;            CsrDereferenceProcess(pcsrp);</div>
<div class="line"><a name="l00340"></a><span class="lineno">  340</span>&#160;            <span class="keywordflow">return</span> SHUTDOWN_KNOWN_PROCESS;</div>
<div class="line"><a name="l00341"></a><span class="lineno">  341</span>&#160;        }</div>
<div class="line"><a name="l00342"></a><span class="lineno">  342</span>&#160; </div>
<div class="line"><a name="l00343"></a><span class="lineno">  343</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00344"></a><span class="lineno">  344</span>&#160;<span class="comment">         * If this process is not in the account being logged off and it</span></div>
<div class="line"><a name="l00345"></a><span class="lineno">  345</span>&#160;<span class="comment">         * is not on the windowstation being logged off, don&#39;t send</span></div>
<div class="line"><a name="l00346"></a><span class="lineno">  346</span>&#160;<span class="comment">         * the end session messages.</span></div>
<div class="line"><a name="l00347"></a><span class="lineno">  347</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00348"></a><span class="lineno">  348</span>&#160;        <span class="keywordflow">if</span> (!(dwClientFlags &amp; WMCS_CONTEXTLOGOFF) &amp;&amp; (ShutdownInfo.hwndDesktop == NULL)) {</div>
<div class="line"><a name="l00349"></a><span class="lineno">  349</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00350"></a><span class="lineno">  350</span>&#160;<span class="comment">             * This process is not in the context being logged off.  Do</span></div>
<div class="line"><a name="l00351"></a><span class="lineno">  351</span>&#160;<span class="comment">             * not terminate it and let console send an event to the process.</span></div>
<div class="line"><a name="l00352"></a><span class="lineno">  352</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00353"></a><span class="lineno">  353</span>&#160;            ShutdownInfo.StatusShutdown = SHUTDOWN_UNKNOWN_PROCESS;</div>
<div class="line"><a name="l00354"></a><span class="lineno">  354</span>&#160;            <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00355"></a><span class="lineno">  355</span>&#160;        }</div>
<div class="line"><a name="l00356"></a><span class="lineno">  356</span>&#160; </div>
<div class="line"><a name="l00357"></a><span class="lineno">  357</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00358"></a><span class="lineno">  358</span>&#160;<span class="comment">         * Shut down this process.</span></div>
<div class="line"><a name="l00359"></a><span class="lineno">  359</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00360"></a><span class="lineno">  360</span>&#160;        cThreads++;</div>
<div class="line"><a name="l00361"></a><span class="lineno">  361</span>&#160;        <span class="keywordflow">if</span> (fNoRetry || !(ShutdownInfo.dwFlags &amp; USER_THREAD_GUI)) {</div>
<div class="line"><a name="l00362"></a><span class="lineno">  362</span>&#160; </div>
<div class="line"><a name="l00363"></a><span class="lineno">  363</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00364"></a><span class="lineno">  364</span>&#160;<span class="comment">             * Dispose of any hard errors.</span></div>
<div class="line"><a name="l00365"></a><span class="lineno">  365</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00366"></a><span class="lineno">  366</span>&#160;            <a class="code" href="a03239.html#ad251c3353b8caac862bb30255af684fa">BoostHardError</a>((<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>)Thread-&gt;ClientId.UniqueProcess, TRUE);</div>
<div class="line"><a name="l00367"></a><span class="lineno">  367</span>&#160;        } <span class="keywordflow">else</span> {</div>
<div class="line"><a name="l00368"></a><span class="lineno">  368</span>&#160; </div>
<div class="line"><a name="l00369"></a><span class="lineno">  369</span>&#160;            CsrReferenceThread(Thread);</div>
<div class="line"><a name="l00370"></a><span class="lineno">  370</span>&#160;            CsrUnlockProcess(Process);</div>
<div class="line"><a name="l00371"></a><span class="lineno">  371</span>&#160; </div>
<div class="line"><a name="l00372"></a><span class="lineno">  372</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00373"></a><span class="lineno">  373</span>&#160;<span class="comment">             * There are problems in changing shutdown to send all the</span></div>
<div class="line"><a name="l00374"></a><span class="lineno">  374</span>&#160;<span class="comment">             * QUERYENDSESSIONs at once before doing any ENDSESSIONs, like</span></div>
<div class="line"><a name="l00375"></a><span class="lineno">  375</span>&#160;<span class="comment">             * Windows does. The whole machine needs to be modal if you do this.</span></div>
<div class="line"><a name="l00376"></a><span class="lineno">  376</span>&#160;<span class="comment">             * If it isn&#39;t modal, then you have this problem. Imagine app 1 and 2.</span></div>
<div class="line"><a name="l00377"></a><span class="lineno">  377</span>&#160;<span class="comment">             * 1 gets the queryendsession, no problem. 2 gets it and brings up a</span></div>
<div class="line"><a name="l00378"></a><span class="lineno">  378</span>&#160;<span class="comment">             * dialog. Now being a simple user, you decide you need to change the</span></div>
<div class="line"><a name="l00379"></a><span class="lineno">  379</span>&#160;<span class="comment">             * document in app 1. Now you switch back to app 2, hit ok, and</span></div>
<div class="line"><a name="l00380"></a><span class="lineno">  380</span>&#160;<span class="comment">             * everything goes away - including app 1 without saving its changes.</span></div>
<div class="line"><a name="l00381"></a><span class="lineno">  381</span>&#160;<span class="comment">             * Also, apps expect that once they&#39;ve received the QUERYENDSESSION,</span></div>
<div class="line"><a name="l00382"></a><span class="lineno">  382</span>&#160;<span class="comment">             * they are not going to get anything else of any particular interest</span></div>
<div class="line"><a name="l00383"></a><span class="lineno">  383</span>&#160;<span class="comment">             * (unless it is a WM_ENDSESSION with FALSE) We had bugs pre 511 where</span></div>
<div class="line"><a name="l00384"></a><span class="lineno">  384</span>&#160;<span class="comment">             * apps were blowing up because of this.</span></div>
<div class="line"><a name="l00385"></a><span class="lineno">  385</span>&#160;<span class="comment">             * If this change is made, the entire system must be modal</span></div>
<div class="line"><a name="l00386"></a><span class="lineno">  386</span>&#160;<span class="comment">             * while this is going on. - ScottLu 6/30/94</span></div>
<div class="line"><a name="l00387"></a><span class="lineno">  387</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00388"></a><span class="lineno">  388</span>&#160;            cmd = <a class="code" href="a03239.html#a1235d4adf091dd34cf85292008e10212">SendShutdownMessages</a>(ShutdownInfo.hwndDesktop, Thread,</div>
<div class="line"><a name="l00389"></a><span class="lineno">  389</span>&#160;                    dwClientFlags | WMCS_QUERYEND);</div>
<div class="line"><a name="l00390"></a><span class="lineno">  390</span>&#160; </div>
<div class="line"><a name="l00391"></a><span class="lineno">  391</span>&#160;            CsrLockProcessByClientId(pcsrp-&gt;ClientId.UniqueProcess, &amp;Process);</div>
<div class="line"><a name="l00392"></a><span class="lineno">  392</span>&#160;            CsrDereferenceThread(Thread);</div>
<div class="line"><a name="l00393"></a><span class="lineno">  393</span>&#160; </div>
<div class="line"><a name="l00394"></a><span class="lineno">  394</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00395"></a><span class="lineno">  395</span>&#160;<span class="comment">             * If shutdown has been cancelled, let csr know about it.</span></div>
<div class="line"><a name="l00396"></a><span class="lineno">  396</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00397"></a><span class="lineno">  397</span>&#160;            <span class="keywordflow">switch</span> (cmd) {</div>
<div class="line"><a name="l00398"></a><span class="lineno">  398</span>&#160;            <span class="keywordflow">case</span> <a class="code" href="a03239.html#a8f11ce738c583d101e1ae328c351deac">CMDEND_USERSAYSCANCEL</a>:</div>
<div class="line"><a name="l00399"></a><span class="lineno">  399</span>&#160;            <span class="keywordflow">case</span> <a class="code" href="a03239.html#ad213141f4fe1fd382bc14446b8e021c5">CMDEND_APPSAYSNOTOK</a>:</div>
<div class="line"><a name="l00400"></a><span class="lineno">  400</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l00401"></a><span class="lineno">  401</span>&#160;<span class="comment">                 * Only allow cancelling if this is not a forced shutdown (if</span></div>
<div class="line"><a name="l00402"></a><span class="lineno">  402</span>&#160;<span class="comment">                 * !fNoRetry)</span></div>
<div class="line"><a name="l00403"></a><span class="lineno">  403</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l00404"></a><span class="lineno">  404</span>&#160;                <span class="keywordflow">if</span> (!fNoRetry) {</div>
<div class="line"><a name="l00405"></a><span class="lineno">  405</span>&#160;                    dwClientFlags &amp;= ~WMCS_EXIT;</div>
<div class="line"><a name="l00406"></a><span class="lineno">  406</span>&#160;                }</div>
<div class="line"><a name="l00407"></a><span class="lineno">  407</span>&#160; </div>
<div class="line"><a name="l00408"></a><span class="lineno">  408</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l00409"></a><span class="lineno">  409</span>&#160;<span class="comment">                 * Fall through.</span></div>
<div class="line"><a name="l00410"></a><span class="lineno">  410</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l00411"></a><span class="lineno">  411</span>&#160;            <span class="keywordflow">case</span> <a class="code" href="a03239.html#aab5abd3edec726f9dd6d86c33e7725c4">CMDEND_APPSAYSOK</a>:</div>
<div class="line"><a name="l00412"></a><span class="lineno">  412</span>&#160;                fSendEndSession = TRUE;</div>
<div class="line"><a name="l00413"></a><span class="lineno">  413</span>&#160;                <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00414"></a><span class="lineno">  414</span>&#160;            <span class="keywordflow">case</span> <a class="code" href="a03239.html#ad66fd118ce776a77cb84fad3ad8cbd29">CMDEND_USERSAYSKILL</a>:</div>
<div class="line"><a name="l00415"></a><span class="lineno">  415</span>&#160;                <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00416"></a><span class="lineno">  416</span>&#160;            <span class="keywordflow">case</span> <a class="code" href="a03239.html#aac6a5a74395a61a33c29e0478eb13945">CMDEND_NOWINDOW</a>:</div>
<div class="line"><a name="l00417"></a><span class="lineno">  417</span>&#160;                <span class="comment">/*</span></div>
<div class="line"><a name="l00418"></a><span class="lineno">  418</span>&#160;<span class="comment">                 * Did this process have a window?</span></div>
<div class="line"><a name="l00419"></a><span class="lineno">  419</span>&#160;<span class="comment">                 * If this is the second pass we terminate the process even if it did</span></div>
<div class="line"><a name="l00420"></a><span class="lineno">  420</span>&#160;<span class="comment">                 * not have any windows in case the app was just starting up.</span></div>
<div class="line"><a name="l00421"></a><span class="lineno">  421</span>&#160;<span class="comment">                 * WOW hits this often when because it takes so long to start up.</span></div>
<div class="line"><a name="l00422"></a><span class="lineno">  422</span>&#160;<span class="comment">                 * Logon (with WOW auto-starting) then logoff WOW won&#39;t die but will</span></div>
<div class="line"><a name="l00423"></a><span class="lineno">  423</span>&#160;<span class="comment">                 * lock some files open so you can&#39;t logon next time.</span></div>
<div class="line"><a name="l00424"></a><span class="lineno">  424</span>&#160;<span class="comment">                 */</span></div>
<div class="line"><a name="l00425"></a><span class="lineno">  425</span>&#160;                <span class="keywordflow">if</span> (fFirstPass) {</div>
<div class="line"><a name="l00426"></a><span class="lineno">  426</span>&#160;                    cThreads--;</div>
<div class="line"><a name="l00427"></a><span class="lineno">  427</span>&#160;                }</div>
<div class="line"><a name="l00428"></a><span class="lineno">  428</span>&#160;                <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00429"></a><span class="lineno">  429</span>&#160;            }</div>
<div class="line"><a name="l00430"></a><span class="lineno">  430</span>&#160;        }</div>
<div class="line"><a name="l00431"></a><span class="lineno">  431</span>&#160;    }</div>
<div class="line"><a name="l00432"></a><span class="lineno">  432</span>&#160; </div>
<div class="line"><a name="l00433"></a><span class="lineno">  433</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00434"></a><span class="lineno">  434</span>&#160;<span class="comment">     * If end session message need to be sent, do it now.</span></div>
<div class="line"><a name="l00435"></a><span class="lineno">  435</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00436"></a><span class="lineno">  436</span>&#160;    <span class="keywordflow">if</span> (fSendEndSession) {</div>
<div class="line"><a name="l00437"></a><span class="lineno">  437</span>&#160; </div>
<div class="line"><a name="l00438"></a><span class="lineno">  438</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00439"></a><span class="lineno">  439</span>&#160;<span class="comment">         * Go through the thread list and mark them as not</span></div>
<div class="line"><a name="l00440"></a><span class="lineno">  440</span>&#160;<span class="comment">         * shutdown yet.</span></div>
<div class="line"><a name="l00441"></a><span class="lineno">  441</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00442"></a><span class="lineno">  442</span>&#160;        ListNext = ListHead-&gt;Flink;</div>
<div class="line"><a name="l00443"></a><span class="lineno">  443</span>&#160;        <span class="keywordflow">while</span> (ListNext != ListHead) {</div>
<div class="line"><a name="l00444"></a><span class="lineno">  444</span>&#160;            Thread = CONTAINING_RECORD( ListNext, CSR_THREAD, Link );</div>
<div class="line"><a name="l00445"></a><span class="lineno">  445</span>&#160;            Thread-&gt;Flags &amp;= ~<a class="code" href="a03239.html#af69e84f5b4d6cc1a962ef7adb4848836">CSR_THREAD_SHUTDOWNSKIP</a>;</div>
<div class="line"><a name="l00446"></a><span class="lineno">  446</span>&#160;            ListNext = ListNext-&gt;Flink;</div>
<div class="line"><a name="l00447"></a><span class="lineno">  447</span>&#160;        }</div>
<div class="line"><a name="l00448"></a><span class="lineno">  448</span>&#160; </div>
<div class="line"><a name="l00449"></a><span class="lineno">  449</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00450"></a><span class="lineno">  450</span>&#160;<span class="comment">         * Perform the proper shutdown operation on each thread.</span></div>
<div class="line"><a name="l00451"></a><span class="lineno">  451</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00452"></a><span class="lineno">  452</span>&#160;        <span class="keywordflow">while</span> (TRUE) {</div>
<div class="line"><a name="l00453"></a><span class="lineno">  453</span>&#160;            ListHead = &amp;pcsrp-&gt;ThreadList;</div>
<div class="line"><a name="l00454"></a><span class="lineno">  454</span>&#160;            ListNext = ListHead-&gt;Flink;</div>
<div class="line"><a name="l00455"></a><span class="lineno">  455</span>&#160;            <span class="keywordflow">while</span> (ListNext != ListHead) {</div>
<div class="line"><a name="l00456"></a><span class="lineno">  456</span>&#160;                Thread = CONTAINING_RECORD( ListNext, CSR_THREAD, Link );</div>
<div class="line"><a name="l00457"></a><span class="lineno">  457</span>&#160;                <span class="keywordflow">if</span> (!(Thread-&gt;Flags &amp;</div>
<div class="line"><a name="l00458"></a><span class="lineno">  458</span>&#160;                        (CSR_THREAD_DESTROYED | <a class="code" href="a03239.html#af69e84f5b4d6cc1a962ef7adb4848836">CSR_THREAD_SHUTDOWNSKIP</a>))) {</div>
<div class="line"><a name="l00459"></a><span class="lineno">  459</span>&#160;                    <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00460"></a><span class="lineno">  460</span>&#160;                }</div>
<div class="line"><a name="l00461"></a><span class="lineno">  461</span>&#160;                ListNext = ListNext-&gt;Flink;</div>
<div class="line"><a name="l00462"></a><span class="lineno">  462</span>&#160;            }</div>
<div class="line"><a name="l00463"></a><span class="lineno">  463</span>&#160;            <span class="keywordflow">if</span> (ListNext == ListHead)</div>
<div class="line"><a name="l00464"></a><span class="lineno">  464</span>&#160;                <span class="keywordflow">break</span>;</div>
<div class="line"><a name="l00465"></a><span class="lineno">  465</span>&#160; </div>
<div class="line"><a name="l00466"></a><span class="lineno">  466</span>&#160;            Thread-&gt;Flags |= <a class="code" href="a03239.html#af69e84f5b4d6cc1a962ef7adb4848836">CSR_THREAD_SHUTDOWNSKIP</a>;</div>
<div class="line"><a name="l00467"></a><span class="lineno">  467</span>&#160;            <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00468"></a><span class="lineno">  468</span>&#160;            Status = <a class="code" href="a00362.html#a4d1853d31fa66209a2b02615f3cf1a97">NtUserQueryInformationThread</a>(Thread-&gt;ThreadHandle,</div>
<div class="line"><a name="l00469"></a><span class="lineno">  469</span>&#160;                    UserThreadShutdownInformation, &amp;ShutdownInfo, <span class="keyword">sizeof</span>(ShutdownInfo), NULL);</div>
<div class="line"><a name="l00470"></a><span class="lineno">  470</span>&#160;            <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l00471"></a><span class="lineno">  471</span>&#160;            <span class="keywordflow">if</span> (!NT_SUCCESS(Status))</div>
<div class="line"><a name="l00472"></a><span class="lineno">  472</span>&#160;                <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00473"></a><span class="lineno">  473</span>&#160;            <span class="keywordflow">if</span> (ShutdownInfo.StatusShutdown == SHUTDOWN_UNKNOWN_PROCESS ||</div>
<div class="line"><a name="l00474"></a><span class="lineno">  474</span>&#160;                    !(ShutdownInfo.dwFlags &amp; USER_THREAD_GUI))</div>
<div class="line"><a name="l00475"></a><span class="lineno">  475</span>&#160;                <span class="keywordflow">continue</span>;</div>
<div class="line"><a name="l00476"></a><span class="lineno">  476</span>&#160; </div>
<div class="line"><a name="l00477"></a><span class="lineno">  477</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00478"></a><span class="lineno">  478</span>&#160;<span class="comment">             * Send the end session messages to the thread.</span></div>
<div class="line"><a name="l00479"></a><span class="lineno">  479</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00480"></a><span class="lineno">  480</span>&#160;            CsrReferenceThread(Thread);</div>
<div class="line"><a name="l00481"></a><span class="lineno">  481</span>&#160;            CsrUnlockProcess(Process);</div>
<div class="line"><a name="l00482"></a><span class="lineno">  482</span>&#160; </div>
<div class="line"><a name="l00483"></a><span class="lineno">  483</span>&#160;            <span class="comment">/*</span></div>
<div class="line"><a name="l00484"></a><span class="lineno">  484</span>&#160;<span class="comment">             * If the user says kill it, the user wants it to go away now</span></div>
<div class="line"><a name="l00485"></a><span class="lineno">  485</span>&#160;<span class="comment">             * no matter what. If the user didn&#39;t say kill, then call again</span></div>
<div class="line"><a name="l00486"></a><span class="lineno">  486</span>&#160;<span class="comment">             * because we need to send WM_ENDSESSION messages.</span></div>
<div class="line"><a name="l00487"></a><span class="lineno">  487</span>&#160;<span class="comment">             */</span></div>
<div class="line"><a name="l00488"></a><span class="lineno">  488</span>&#160;            <a class="code" href="a03239.html#a1235d4adf091dd34cf85292008e10212">SendShutdownMessages</a>(ShutdownInfo.hwndDesktop, Thread, dwClientFlags);</div>
<div class="line"><a name="l00489"></a><span class="lineno">  489</span>&#160; </div>
<div class="line"><a name="l00490"></a><span class="lineno">  490</span>&#160;            CsrLockProcessByClientId(pcsrp-&gt;ClientId.UniqueProcess, &amp;Process);</div>
<div class="line"><a name="l00491"></a><span class="lineno">  491</span>&#160;            CsrDereferenceThread(Thread);</div>
<div class="line"><a name="l00492"></a><span class="lineno">  492</span>&#160;        }</div>
<div class="line"><a name="l00493"></a><span class="lineno">  493</span>&#160;    }</div>
<div class="line"><a name="l00494"></a><span class="lineno">  494</span>&#160; </div>
<div class="line"><a name="l00495"></a><span class="lineno">  495</span>&#160;    CsrUnlockProcess(Process);</div>
<div class="line"><a name="l00496"></a><span class="lineno">  496</span>&#160; </div>
<div class="line"><a name="l00497"></a><span class="lineno">  497</span>&#160;    <span class="keywordflow">if</span> (!fNoRetry &amp;&amp; !(dwClientFlags &amp; WMCS_EXIT)) {</div>
<div class="line"><a name="l00498"></a><span class="lineno">  498</span>&#160;        <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00499"></a><span class="lineno">  499</span>&#160;        CsrDereferenceProcess(pcsrp);</div>
<div class="line"><a name="l00500"></a><span class="lineno">  500</span>&#160;        <span class="keywordflow">return</span> SHUTDOWN_CANCEL;</div>
<div class="line"><a name="l00501"></a><span class="lineno">  501</span>&#160;    }</div>
<div class="line"><a name="l00502"></a><span class="lineno">  502</span>&#160; </div>
<div class="line"><a name="l00503"></a><span class="lineno">  503</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00504"></a><span class="lineno">  504</span>&#160;<span class="comment">     * Set the final shutdown status according to the number of gui</span></div>
<div class="line"><a name="l00505"></a><span class="lineno">  505</span>&#160;<span class="comment">     * threads found.  If the count is zero, we have an unknown process.</span></div>
<div class="line"><a name="l00506"></a><span class="lineno">  506</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00507"></a><span class="lineno">  507</span>&#160;    <span class="keywordflow">if</span> (cThreads == 0)</div>
<div class="line"><a name="l00508"></a><span class="lineno">  508</span>&#160;        ShutdownInfo.StatusShutdown = SHUTDOWN_UNKNOWN_PROCESS;</div>
<div class="line"><a name="l00509"></a><span class="lineno">  509</span>&#160;    <span class="keywordflow">else</span></div>
<div class="line"><a name="l00510"></a><span class="lineno">  510</span>&#160;        ShutdownInfo.StatusShutdown = SHUTDOWN_KNOWN_PROCESS;</div>
<div class="line"><a name="l00511"></a><span class="lineno">  511</span>&#160; </div>
<div class="line"><a name="l00512"></a><span class="lineno">  512</span>&#160;    <span class="keywordflow">if</span> (ShutdownInfo.StatusShutdown == SHUTDOWN_UNKNOWN_PROCESS ||</div>
<div class="line"><a name="l00513"></a><span class="lineno">  513</span>&#160;            !(dwClientFlags &amp; WMCS_CONTEXTLOGOFF)) {</div>
<div class="line"><a name="l00514"></a><span class="lineno">  514</span>&#160; </div>
<div class="line"><a name="l00515"></a><span class="lineno">  515</span>&#160;        <span class="comment">/*</span></div>
<div class="line"><a name="l00516"></a><span class="lineno">  516</span>&#160;<span class="comment">         * This process is not in the context being logged off.  Do</span></div>
<div class="line"><a name="l00517"></a><span class="lineno">  517</span>&#160;<span class="comment">         * not terminate it and let console send an event to the process.</span></div>
<div class="line"><a name="l00518"></a><span class="lineno">  518</span>&#160;<span class="comment">         */</span></div>
<div class="line"><a name="l00519"></a><span class="lineno">  519</span>&#160;        <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00520"></a><span class="lineno">  520</span>&#160;        <span class="keywordflow">return</span> SHUTDOWN_UNKNOWN_PROCESS;</div>
<div class="line"><a name="l00521"></a><span class="lineno">  521</span>&#160;    }</div>
<div class="line"><a name="l00522"></a><span class="lineno">  522</span>&#160; </div>
<div class="line"><a name="l00523"></a><span class="lineno">  523</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00524"></a><span class="lineno">  524</span>&#160;<span class="comment">     * Calling ExitProcess() in the app&#39;s context will not always work</span></div>
<div class="line"><a name="l00525"></a><span class="lineno">  525</span>&#160;<span class="comment">     * because the app may have .dll termination deadlocks: so the thread</span></div>
<div class="line"><a name="l00526"></a><span class="lineno">  526</span>&#160;<span class="comment">     * will hang with the rest of the process. To ensure apps go away,</span></div>
<div class="line"><a name="l00527"></a><span class="lineno">  527</span>&#160;<span class="comment">     * we terminate the process with NtTerminateProcess().</span></div>
<div class="line"><a name="l00528"></a><span class="lineno">  528</span>&#160;<span class="comment">     *</span></div>
<div class="line"><a name="l00529"></a><span class="lineno">  529</span>&#160;<span class="comment">     * Pass this special value, DBG_TERMINATE_PROCESS, which tells</span></div>
<div class="line"><a name="l00530"></a><span class="lineno">  530</span>&#160;<span class="comment">     * NtTerminateProcess() to return failure if it can&#39;t terminate the</span></div>
<div class="line"><a name="l00531"></a><span class="lineno">  531</span>&#160;<span class="comment">     * process because the app is being debugged.</span></div>
<div class="line"><a name="l00532"></a><span class="lineno">  532</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00533"></a><span class="lineno">  533</span>&#160;    NtTerminateProcess(pcsrp-&gt;ProcessHandle, DBG_TERMINATE_PROCESS);</div>
<div class="line"><a name="l00534"></a><span class="lineno">  534</span>&#160;    pcsrp-&gt;Flags |= CSR_PROCESS_TERMINATED;</div>
<div class="line"><a name="l00535"></a><span class="lineno">  535</span>&#160; </div>
<div class="line"><a name="l00536"></a><span class="lineno">  536</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00537"></a><span class="lineno">  537</span>&#160;<span class="comment">     * Let csr know we know about this process - meaning it was our</span></div>
<div class="line"><a name="l00538"></a><span class="lineno">  538</span>&#160;<span class="comment">     * responsibility to shut it down.</span></div>
<div class="line"><a name="l00539"></a><span class="lineno">  539</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00540"></a><span class="lineno">  540</span>&#160;    <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l00541"></a><span class="lineno">  541</span>&#160; </div>
<div class="line"><a name="l00542"></a><span class="lineno">  542</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l00543"></a><span class="lineno">  543</span>&#160;<span class="comment">     * Now that we&#39;re done with the process handle, derefence the csr</span></div>
<div class="line"><a name="l00544"></a><span class="lineno">  544</span>&#160;<span class="comment">     * process structure.</span></div>
<div class="line"><a name="l00545"></a><span class="lineno">  545</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l00546"></a><span class="lineno">  546</span>&#160;    CsrDereferenceProcess(pcsrp);</div>
<div class="line"><a name="l00547"></a><span class="lineno">  547</span>&#160;    <span class="keywordflow">return</span> SHUTDOWN_KNOWN_PROCESS;</div>
<div class="line"><a name="l00548"></a><span class="lineno">  548</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a00947_source.html#l01464">BoostHardError()</a>, <a class="el" href="a03239_source.html#l00036">CMDEND_APPSAYSNOTOK</a>, <a class="el" href="a03239_source.html#l00035">CMDEND_APPSAYSOK</a>, <a class="el" href="a03239_source.html#l00039">CMDEND_NOWINDOW</a>, <a class="el" href="a03239_source.html#l00038">CMDEND_USERSAYSCANCEL</a>, <a class="el" href="a03239_source.html#l00037">CMDEND_USERSAYSKILL</a>, <a class="el" href="a03239_source.html#l00044">CSR_THREAD_SHUTDOWNSKIP</a>, <a class="el" href="a00563_source.html#l00175">DWORD</a>, <a class="el" href="a03257_source.html#l00295">dwThreadEndSession</a>, <a class="el" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit()</a>, <a class="el" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit()</a>, <a class="el" href="a03614_source.html#l06006">NtUserQueryInformationThread()</a>, <a class="el" href="a03239_source.html#l00572">SendShutdownMessages()</a> , 以及 <a class="el" href="a03608.html#afd1a0e78d1f88954d93e48ab3821781f">UINT()</a>.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03668_source.html#l00184">UserServerDllInitialization()</a>.</p>

</div>
</div>
<a id="a4c3e71728419b51abac3cd3731c7891d"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a4c3e71728419b51abac3cd3731c7891d">&#9670;&nbsp;</a></span>WowExitTask()</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">BOOL WowExitTask </td>
          <td>(</td>
          <td class="paramtype">PCSR_THREAD&#160;</td>
          <td class="paramname"><em>pcsrt</em></td><td>)</td>
          <td></td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l01188">1188</a> 行定义.</p>
<div class="fragment"><div class="line"><a name="l01190"></a><span class="lineno"> 1190</span>&#160;{</div>
<div class="line"><a name="l01191"></a><span class="lineno"> 1191</span>&#160;    HANDLE ahandle[2];</div>
<div class="line"><a name="l01192"></a><span class="lineno"> 1192</span>&#160;    USERTHREAD_WOW_INFORMATION WowInfo;</div>
<div class="line"><a name="l01193"></a><span class="lineno"> 1193</span>&#160;    NTSTATUS Status;</div>
<div class="line"><a name="l01194"></a><span class="lineno"> 1194</span>&#160; </div>
<div class="line"><a name="l01195"></a><span class="lineno"> 1195</span>&#160;    ahandle[1] = <a class="code" href="a03260.html#a7734daf887ee2ecb9d7b91c68e67ba3a">heventCancel</a>;</div>
<div class="line"><a name="l01196"></a><span class="lineno"> 1196</span>&#160; </div>
<div class="line"><a name="l01197"></a><span class="lineno"> 1197</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01198"></a><span class="lineno"> 1198</span>&#160;<span class="comment">     * Query task id and exit function.</span></div>
<div class="line"><a name="l01199"></a><span class="lineno"> 1199</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01200"></a><span class="lineno"> 1200</span>&#160;    <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01201"></a><span class="lineno"> 1201</span>&#160;    Status = <a class="code" href="a00362.html#a4d1853d31fa66209a2b02615f3cf1a97">NtUserQueryInformationThread</a>(pcsrt-&gt;ThreadHandle,</div>
<div class="line"><a name="l01202"></a><span class="lineno"> 1202</span>&#160;            UserThreadWOWInformation, &amp;WowInfo, <span class="keyword">sizeof</span>(WowInfo), NULL);</div>
<div class="line"><a name="l01203"></a><span class="lineno"> 1203</span>&#160;    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l01204"></a><span class="lineno"> 1204</span>&#160;    <span class="keywordflow">if</span> (!NT_SUCCESS(Status))</div>
<div class="line"><a name="l01205"></a><span class="lineno"> 1205</span>&#160;        <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l01206"></a><span class="lineno"> 1206</span>&#160; </div>
<div class="line"><a name="l01207"></a><span class="lineno"> 1207</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01208"></a><span class="lineno"> 1208</span>&#160;<span class="comment">     * If no task id was returned, it is not a WOW task</span></div>
<div class="line"><a name="l01209"></a><span class="lineno"> 1209</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01210"></a><span class="lineno"> 1210</span>&#160;    <span class="keywordflow">if</span> (WowInfo.hTaskWow == 0)</div>
<div class="line"><a name="l01211"></a><span class="lineno"> 1211</span>&#160;        <span class="keywordflow">return</span> FALSE;</div>
<div class="line"><a name="l01212"></a><span class="lineno"> 1212</span>&#160; </div>
<div class="line"><a name="l01213"></a><span class="lineno"> 1213</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01214"></a><span class="lineno"> 1214</span>&#160;<span class="comment">     * The created thread needs to be able to reenter user because this</span></div>
<div class="line"><a name="l01215"></a><span class="lineno"> 1215</span>&#160;<span class="comment">     * call will grab the CSR critical section and whoever has that</span></div>
<div class="line"><a name="l01216"></a><span class="lineno"> 1216</span>&#160;<span class="comment">     * may need to grab the USER critical section before it can</span></div>
<div class="line"><a name="l01217"></a><span class="lineno"> 1217</span>&#160;<span class="comment">     * release it.</span></div>
<div class="line"><a name="l01218"></a><span class="lineno"> 1218</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01219"></a><span class="lineno"> 1219</span>&#160;    <a class="code" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a>();</div>
<div class="line"><a name="l01220"></a><span class="lineno"> 1220</span>&#160; </div>
<div class="line"><a name="l01221"></a><span class="lineno"> 1221</span>&#160;    <span class="comment">/*</span></div>
<div class="line"><a name="l01222"></a><span class="lineno"> 1222</span>&#160;<span class="comment">     * Try to make it exit itself. This will work most of the time.</span></div>
<div class="line"><a name="l01223"></a><span class="lineno"> 1223</span>&#160;<span class="comment">     * If this doesn&#39;t work, terminate this process.</span></div>
<div class="line"><a name="l01224"></a><span class="lineno"> 1224</span>&#160;<span class="comment">     */</span></div>
<div class="line"><a name="l01225"></a><span class="lineno"> 1225</span>&#160;    ahandle[0] = <a class="code" href="a03239.html#a33b594ea0681c07ef423632f5645ff39">InternalCreateCallbackThread</a>(pcsrt-&gt;Process-&gt;ProcessHandle,</div>
<div class="line"><a name="l01226"></a><span class="lineno"> 1226</span>&#160;                                              (<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>)WowInfo.lpfnWowExitTask,</div>
<div class="line"><a name="l01227"></a><span class="lineno"> 1227</span>&#160;                                              (<a class="code" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a>)WowInfo.hTaskWow);</div>
<div class="line"><a name="l01228"></a><span class="lineno"> 1228</span>&#160;    <span class="keywordflow">if</span> (ahandle[0] == NULL) {</div>
<div class="line"><a name="l01229"></a><span class="lineno"> 1229</span>&#160;        NtTerminateProcess(pcsrt-&gt;Process-&gt;ProcessHandle, 0);</div>
<div class="line"><a name="l01230"></a><span class="lineno"> 1230</span>&#160;        pcsrt-&gt;Process-&gt;Flags |= CSR_PROCESS_TERMINATED;</div>
<div class="line"><a name="l01231"></a><span class="lineno"> 1231</span>&#160;        <span class="keywordflow">goto</span> Exit;</div>
<div class="line"><a name="l01232"></a><span class="lineno"> 1232</span>&#160;    }</div>
<div class="line"><a name="l01233"></a><span class="lineno"> 1233</span>&#160; </div>
<div class="line"><a name="l01234"></a><span class="lineno"> 1234</span>&#160;    WaitForMultipleObjects(2, ahandle, FALSE, INFINITE);</div>
<div class="line"><a name="l01235"></a><span class="lineno"> 1235</span>&#160;    NtClose(ahandle[0]);</div>
<div class="line"><a name="l01236"></a><span class="lineno"> 1236</span>&#160; </div>
<div class="line"><a name="l01237"></a><span class="lineno"> 1237</span>&#160;Exit:</div>
<div class="line"><a name="l01238"></a><span class="lineno"> 1238</span>&#160;    <a class="code" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a>();</div>
<div class="line"><a name="l01239"></a><span class="lineno"> 1239</span>&#160;    <span class="keywordflow">return</span> TRUE;</div>
<div class="line"><a name="l01240"></a><span class="lineno"> 1240</span>&#160;}</div>
</div><!-- fragment -->
<p class="reference">引用了 <a class="el" href="a00563_source.html#l00175">DWORD</a>, <a class="el" href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit()</a>, <a class="el" href="a03260_source.html#l00027">heventCancel</a>, <a class="el" href="a03239_source.html#l01302">InternalCreateCallbackThread()</a>, <a class="el" href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit()</a> , 以及 <a class="el" href="a03614_source.html#l06006">NtUserQueryInformationThread()</a>.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l01055">_EndTask()</a> , 以及 <a class="el" href="a03239_source.html#l00572">SendShutdownMessages()</a>.</p>

</div>
</div>
<h2 class="groupheader">变量说明</h2>
<a id="a03f0b7bae20eca44bfb023829e957e3b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a03f0b7bae20eca44bfb023829e957e3b">&#9670;&nbsp;</a></span>gcInternalDoEndTaskDialog</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname">int gcInternalDoEndTaskDialog = 0</td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00066">66</a> 行定义.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l00068">_ExitWindowsEx()</a> , 以及 <a class="el" href="a03239_source.html#l01270">InternalDoEndTaskDialog()</a>.</p>

</div>
</div>
<a id="a76588185d43cb97e9647d0765c2d7c7b"></a>
<h2 class="memtitle"><span class="permalink"><a href="#a76588185d43cb97e9647d0765c2d7c7b">&#9670;&nbsp;</a></span>gdwFlags</h2>

<div class="memitem">
<div class="memproto">
      <table class="memname">
        <tr>
          <td class="memname"><a class="el" href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a> gdwFlags = 0</td>
        </tr>
      </table>
</div><div class="memdoc">

<p class="definition">在文件 <a class="el" href="a03239_source.html">server/exitwin.c</a> 第 <a class="el" href="a03239_source.html#l00065">65</a> 行定义.</p>

<p class="reference">被这些函数引用 <a class="el" href="a03239_source.html#l00068">_ExitWindowsEx()</a>.</p>

</div>
</div>
</div><!-- contents -->
</div><!-- doc-content -->
<div class="ttc" id="aa00017_html_a24afbf4ddb86fdedeb15a6b679902e71"><div class="ttname"><a href="a00017.html#a24afbf4ddb86fdedeb15a6b679902e71">EnumThreadWindows</a></div><div class="ttdeci">BOOL EnumThreadWindows(DWORD idThread, WNDENUMPROC lpfn, LONG lParam)</div><div class="ttdef"><b>Definition:</b> <a href="a00017_source.html#l00070">clenum.c:70</a></div></div>
<div class="ttc" id="aa03029_html_a31c2497f5c30692c601a804d9c586738"><div class="ttname"><a href="a03029.html#a31c2497f5c30692c601a804d9c586738">_ENDDLGPARAMS::pszTitle</a></div><div class="ttdeci">TCHAR * pszTitle</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00900">server/exitwin.c:900</a></div></div>
<div class="ttc" id="aa00362_html_a4d1853d31fa66209a2b02615f3cf1a97"><div class="ttname"><a href="a00362.html#a4d1853d31fa66209a2b02615f3cf1a97">NtUserQueryInformationThread</a></div><div class="ttdeci">NTSTATUS NtUserQueryInformationThread(IN HANDLE hThread, IN USERTHREADINFOCLASS ThreadInfoClass, OUT PVOID ThreadInformation, IN ULONG ThreadInformationLength, IN OUT PULONG ReturnLength OPTIONAL)</div><div class="ttdef"><b>Definition:</b> <a href="a03614_source.html#l06006">kernel/ntstubs.c:6006</a></div></div>
<div class="ttc" id="aa03239_html_a1235d4adf091dd34cf85292008e10212"><div class="ttname"><a href="a03239.html#a1235d4adf091dd34cf85292008e10212">SendShutdownMessages</a></div><div class="ttdeci">DWORD SendShutdownMessages(HWND hwndDesktop, PCSR_THREAD pcsrt, DWORD dwClientFlags)</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00572">server/exitwin.c:572</a></div></div>
<div class="ttc" id="aa00947_html_aef87df1174fdc7e8f3988875e8288c18"><div class="ttname"><a href="a00947.html#aef87df1174fdc7e8f3988875e8288c18">WindowEnumProc</a></div><div class="ttdeci">BOOL CALLBACK WindowEnumProc(HWND hwnd, LPARAM lParam)</div><div class="ttdef"><b>Definition:</b> <a href="a00947_source.html#l00195">harderr.c:195</a></div></div>
<div class="ttc" id="aa03260_html_a7eb2ff513af1241501c8b9e72102328f"><div class="ttname"><a href="a03260.html#a7eb2ff513af1241501c8b9e72102328f">heventCancelled</a></div><div class="ttdeci">HANDLE heventCancelled</div><div class="ttdef"><b>Definition:</b> <a href="a03260_source.html#l00028">server/globals.c:28</a></div></div>
<div class="ttc" id="aa00899_html_ae451a2dc8791c420d7c956a63adc33ba"><div class="ttname"><a href="a00899.html#ae451a2dc8791c420d7c956a63adc33ba">EnterCrit</a></div><div class="ttdeci">VOID EnterCrit(VOID)</div></div>
<div class="ttc" id="aa03239_html_aab5abd3edec726f9dd6d86c33e7725c4"><div class="ttname"><a href="a03239.html#aab5abd3edec726f9dd6d86c33e7725c4">CMDEND_APPSAYSOK</a></div><div class="ttdeci">#define CMDEND_APPSAYSOK</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00035">server/exitwin.c:35</a></div></div>
<div class="ttc" id="aa03239_html_ad251c3353b8caac862bb30255af684fa"><div class="ttname"><a href="a03239.html#ad251c3353b8caac862bb30255af684fa">BoostHardError</a></div><div class="ttdeci">BOOL BoostHardError(DWORD dwProcessId, BOOL fForce)</div><div class="ttdef"><b>Definition:</b> <a href="a00947_source.html#l01464">harderr.c:1464</a></div></div>
<div class="ttc" id="aa00074_html_ac16585e37e0ffa0730da4435597e4f05"><div class="ttname"><a href="a00074.html#ac16585e37e0ffa0730da4435597e4f05">GetThreadDesktop</a></div><div class="ttdeci">HDESK WINAPI GetThreadDesktop(DWORD dwThreadId)</div><div class="ttdef"><b>Definition:</b> <a href="a00074_source.html#l00293">csrstubs.c:293</a></div></div>
<div class="ttc" id="aa03239_html_a76588185d43cb97e9647d0765c2d7c7b"><div class="ttname"><a href="a03239.html#a76588185d43cb97e9647d0765c2d7c7b">gdwFlags</a></div><div class="ttdeci">DWORD gdwFlags</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00065">server/exitwin.c:65</a></div></div>
<div class="ttc" id="aa03239_html_af69e84f5b4d6cc1a962ef7adb4848836"><div class="ttname"><a href="a03239.html#af69e84f5b4d6cc1a962ef7adb4848836">CSR_THREAD_SHUTDOWNSKIP</a></div><div class="ttdeci">#define CSR_THREAD_SHUTDOWNSKIP</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00044">server/exitwin.c:44</a></div></div>
<div class="ttc" id="aa03260_html_a65d2845dd8d59d521c009580f0313690"><div class="ttname"><a href="a03260.html#a65d2845dd8d59d521c009580f0313690">gfHardError</a></div><div class="ttdeci">UINT gfHardError</div><div class="ttdef"><b>Definition:</b> <a href="a03260_source.html#l00023">server/globals.c:23</a></div></div>
<div class="ttc" id="aa00563_html_a7b9b0ae15722c1f5e47208b05166acf3"><div class="ttname"><a href="a00563.html#a7b9b0ae15722c1f5e47208b05166acf3">type</a></div><div class="ttdeci">ddeml v[i&lt; inst &gt;][t&lt; type &gt;][hObj|pObj] Dump DDEML state information ddeml lists all ddeml instances for this process n ddeml t&lt; type &gt; lists all ddeml objects of the given type n type</div><div class="ttdef"><b>Definition:</b> <a href="a00563_source.html#l00068">exts.h:68</a></div></div>
<div class="ttc" id="aa03239_html_af72b486135dd980945ed91746e345a8a"><div class="ttname"><a href="a03239.html#af72b486135dd980945ed91746e345a8a">_EndTask</a></div><div class="ttdeci">BOOL _EndTask(HWND hwnd, BOOL fShutdown, BOOL fMeanKill)</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l01055">server/exitwin.c:1055</a></div></div>
<div class="ttc" id="aa03260_html_a2e38c8fb530756e6c474c428087414ac"><div class="ttname"><a href="a03260.html#a2e38c8fb530756e6c474c428087414ac">gphiList</a></div><div class="ttdeci">PHARDERRORINFO gphiList</div><div class="ttdef"><b>Definition:</b> <a href="a03260_source.html#l00024">server/globals.c:24</a></div></div>
<div class="ttc" id="aa03037_html"><div class="ttname"><a href="a03037.html">tagHARDERRORINFO</a></div><div class="ttdef"><b>Definition:</b> <a href="a00950_source.html#l00089">usersrv.h:89</a></div></div>
<div class="ttc" id="aa00356_html_a1e4f6d327f4f3c923ad4f870bc4cd259"><div class="ttname"><a href="a00356.html#a1e4f6d327f4f3c923ad4f870bc4cd259">SendNotifyMessage</a></div><div class="ttdeci">BOOL APIENTRY SendNotifyMessage(HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM lParam)</div><div class="ttdef"><b>Definition:</b> <a href="a00356_source.html#l00957">ntcftxt.h:957</a></div></div>
<div class="ttc" id="aa03029_html_a9c5b0e0659c167ccbc5a5bb9886ce14b"><div class="ttname"><a href="a03029.html#a9c5b0e0659c167ccbc5a5bb9886ce14b">_ENDDLGPARAMS::cSeconds</a></div><div class="ttdeci">int cSeconds</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00903">server/exitwin.c:903</a></div></div>
<div class="ttc" id="aa03239_html_ad213141f4fe1fd382bc14446b8e021c5"><div class="ttname"><a href="a03239.html#ad213141f4fe1fd382bc14446b8e021c5">CMDEND_APPSAYSNOTOK</a></div><div class="ttdeci">#define CMDEND_APPSAYSNOTOK</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00036">server/exitwin.c:36</a></div></div>
<div class="ttc" id="aa00263_html_a1dc37c01a43d34053e1dbf4ee8e0da0a"><div class="ttname"><a href="a00263.html#a1dc37c01a43d34053e1dbf4ee8e0da0a">GetWindowThreadProcessId</a></div><div class="ttdeci">DWORD GetWindowThreadProcessId(HWND hwnd, LPDWORD lpdwProcessId)</div><div class="ttdef"><b>Definition:</b> <a href="a00263_source.html#l00211">winmgrc.c:211</a></div></div>
<div class="ttc" id="aa03239_html_a7143e883c651100c3c38ffa2537c93ed"><div class="ttname"><a href="a03239.html#a7143e883c651100c3c38ffa2537c93ed">CCHMSGMAX</a></div><div class="ttdeci">#define CCHMSGMAX</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00041">server/exitwin.c:41</a></div></div>
<div class="ttc" id="aa00356_html_a9975aeae52f4537ddbf083d32e928001"><div class="ttname"><a href="a00356.html#a9975aeae52f4537ddbf083d32e928001">PostThreadMessage</a></div><div class="ttdeci">BOOL APIENTRY PostThreadMessage(DWORD idThread, UINT msg, WPARAM wParam, LPARAM lParam)</div><div class="ttdef"><b>Definition:</b> <a href="a00356_source.html#l00534">ntcftxt.h:534</a></div></div>
<div class="ttc" id="aa03743_html_ac5ede70e870dc1cf540d7524887e4edc"><div class="ttname"><a href="a03743.html#ac5ede70e870dc1cf540d7524887e4edc">IsWindow</a></div><div class="ttdeci">BOOL IsWindow(HWND hwnd)</div><div class="ttdef"><b>Definition:</b> <a href="a03743_source.html#l00421">client/wow.c:421</a></div></div>
<div class="ttc" id="aa03029_html"><div class="ttname"><a href="a03029.html">_ENDDLGPARAMS</a></div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00899">server/exitwin.c:899</a></div></div>
<div class="ttc" id="aa00371_html_a162a73e20dfabca084a3ebb4581631a8"><div class="ttname"><a href="a00371.html#a162a73e20dfabca084a3ebb4581631a8">UserAssert</a></div><div class="ttdeci">#define UserAssert(exp)</div><div class="ttdef"><b>Definition:</b> <a href="a00950_source.html#l00117">usersrv.h:117</a></div></div>
<div class="ttc" id="aa03037_html_a64d04007b925ebd160829e7c3371524b"><div class="ttname"><a href="a03037.html#a64d04007b925ebd160829e7c3371524b">tagHARDERRORINFO::pmsg</a></div><div class="ttdeci">PHARDERROR_MSG pmsg</div><div class="ttdef"><b>Definition:</b> <a href="a00950_source.html#l00093">usersrv.h:93</a></div></div>
<div class="ttc" id="aa03239_html_aadc5a0499586d2b3c2ce8b850dc53abd"><div class="ttname"><a href="a03239.html#aadc5a0499586d2b3c2ce8b850dc53abd">FindWindowFromThread</a></div><div class="ttdeci">BOOL CALLBACK FindWindowFromThread(HWND hwnd, LPARAM lParam)</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00558">server/exitwin.c:558</a></div></div>
<div class="ttc" id="aa00356_html_a3f53b9d5a549a62853c4e3fb22b649d7"><div class="ttname"><a href="a00356.html#a3f53b9d5a549a62853c4e3fb22b649d7">PostMessage</a></div><div class="ttdeci">BOOL APIENTRY PostMessage(HWND hwnd, UINT wMsg, WPARAM wParam, LPARAM lParam)</div><div class="ttdef"><b>Definition:</b> <a href="a00356_source.html#l00471">ntcftxt.h:471</a></div></div>
<div class="ttc" id="aa03239_html_a33b594ea0681c07ef423632f5645ff39"><div class="ttname"><a href="a03239.html#a33b594ea0681c07ef423632f5645ff39">InternalCreateCallbackThread</a></div><div class="ttdeci">HANDLE InternalCreateCallbackThread(HANDLE hProcess, DWORD lpfn, DWORD dwData)</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l01302">server/exitwin.c:1302</a></div></div>
<div class="ttc" id="aa00026_html_a0427963300ccb73271752f9310fab5c8"><div class="ttname"><a href="a00026.html#a0427963300ccb73271752f9310fab5c8">SetForegroundWindow</a></div><div class="ttdeci">BOOL SetForegroundWindow(HWND hwnd)</div><div class="ttdef"><b>Definition:</b> <a href="a00026_source.html#l02960">client.c:2960</a></div></div>
<div class="ttc" id="aa03239_html_a72f325200de1f3aabe8bf31e2f7fad87"><div class="ttname"><a href="a03239.html#a72f325200de1f3aabe8bf31e2f7fad87">BEGIN_LPC_RECV</a></div><div class="ttdeci">#define BEGIN_LPC_RECV(API)</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00016">server/exitwin.c:16</a></div></div>
<div class="ttc" id="aa03266_html_a515921616ee307c5862eb0be3a8e7c1e"><div class="ttname"><a href="a03266.html#a515921616ee307c5862eb0be3a8e7c1e">psTcb</a></div><div class="ttdeci">PRIVILEGE_SET psTcb</div><div class="ttdef"><b>Definition:</b> <a href="a00839_source.html#l00022">security.c:22</a></div></div>
<div class="ttc" id="aa03239_html_aac6a5a74395a61a33c29e0478eb13945"><div class="ttname"><a href="a03239.html#aac6a5a74395a61a33c29e0478eb13945">CMDEND_NOWINDOW</a></div><div class="ttdeci">#define CMDEND_NOWINDOW</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00039">server/exitwin.c:39</a></div></div>
<div class="ttc" id="aa03029_html_a82c0d31cf840e5fedfaa52b799063e44"><div class="ttname"><a href="a03029.html#a82c0d31cf840e5fedfaa52b799063e44">_ENDDLGPARAMS::type</a></div><div class="ttdeci">UINT type</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00902">server/exitwin.c:902</a></div></div>
<div class="ttc" id="aa03239_html_a4c3e71728419b51abac3cd3731c7891d"><div class="ttname"><a href="a03239.html#a4c3e71728419b51abac3cd3731c7891d">WowExitTask</a></div><div class="ttdeci">BOOL WowExitTask(PCSR_THREAD pcsrt)</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l01188">server/exitwin.c:1188</a></div></div>
<div class="ttc" id="aa03239_html_a03f0b7bae20eca44bfb023829e957e3b"><div class="ttname"><a href="a03239.html#a03f0b7bae20eca44bfb023829e957e3b">gcInternalDoEndTaskDialog</a></div><div class="ttdeci">int gcInternalDoEndTaskDialog</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00066">server/exitwin.c:66</a></div></div>
<div class="ttc" id="aa03260_html_a7734daf887ee2ecb9d7b91c68e67ba3a"><div class="ttname"><a href="a03260.html#a7734daf887ee2ecb9d7b91c68e67ba3a">heventCancel</a></div><div class="ttdeci">HANDLE heventCancel</div><div class="ttdef"><b>Definition:</b> <a href="a03260_source.html#l00027">server/globals.c:27</a></div></div>
<div class="ttc" id="aa03239_html_a25eb30750161d9f640fdb5da4da98d28"><div class="ttname"><a href="a03239.html#a25eb30750161d9f640fdb5da4da98d28">EndTaskDlgProc</a></div><div class="ttdeci">LONG APIENTRY EndTaskDlgProc(HWND hwndDlg, UINT msg, UINT wParam, LONG lParam)</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00916">server/exitwin.c:916</a></div></div>
<div class="ttc" id="aa00563_html_a074685e97e89d6aa2accdfcb82328699"><div class="ttname"><a href="a00563.html#a074685e97e89d6aa2accdfcb82328699">DWORD</a></div><div class="ttdeci">ddeml v[i&lt; inst &gt;][t&lt; type &gt;][hObj|pObj] Dump DDEML state information ddeml lists all ddeml instances for this process n ddeml t&lt; type &gt; lists all ddeml objects of the given type n n assumes link is first DWORD</div><div class="ttdef"><b>Definition:</b> <a href="a00563_source.html#l00175">exts.h:175</a></div></div>
<div class="ttc" id="aa03239_html_a6e1f93446f792e5b40d9bd6307c4430c"><div class="ttname"><a href="a03239.html#a6e1f93446f792e5b40d9bd6307c4430c">DoEndTaskDialog</a></div><div class="ttdeci">int DoEndTaskDialog(WCHAR *pszTitle, HANDLE h, UINT type, int cSeconds)</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l01016">server/exitwin.c:1016</a></div></div>
<div class="ttc" id="aa03239_html_a8f11ce738c583d101e1ae328c351deac"><div class="ttname"><a href="a03239.html#a8f11ce738c583d101e1ae328c351deac">CMDEND_USERSAYSCANCEL</a></div><div class="ttdeci">#define CMDEND_USERSAYSCANCEL</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00038">server/exitwin.c:38</a></div></div>
<div class="ttc" id="aa03260_html_ae6e524b3fef38672dd5c9316ed526bf7"><div class="ttname"><a href="a03260.html#ae6e524b3fef38672dd5c9316ed526bf7">gdwServicesProcessId</a></div><div class="ttdeci">DWORD gdwServicesProcessId</div><div class="ttdef"><b>Definition:</b> <a href="a03260_source.html#l00039">server/globals.c:39</a></div></div>
<div class="ttc" id="aa03037_html_aebf5ac041d62ab0c360c51eaa0cdd3a2"><div class="ttname"><a href="a03037.html#aebf5ac041d62ab0c360c51eaa0cdd3a2">tagHARDERRORINFO::hEventHardError</a></div><div class="ttdeci">HANDLE hEventHardError</div><div class="ttdef"><b>Definition:</b> <a href="a00950_source.html#l00092">usersrv.h:92</a></div></div>
<div class="ttc" id="aa03239_html_adaea996c1b105ea7798e9b4763cb7135"><div class="ttname"><a href="a03239.html#adaea996c1b105ea7798e9b4763cb7135">MySendEndSessionMessages</a></div><div class="ttdeci">DWORD MySendEndSessionMessages(HWND hwnd, PCSR_THREAD pcsrt, BOOL fEndTask, DWORD dwClientFlags)</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00634">server/exitwin.c:634</a></div></div>
<div class="ttc" id="aa00362_html_a59e7c7ee34e45834b8af2b59508f5e95"><div class="ttname"><a href="a00362.html#a59e7c7ee34e45834b8af2b59508f5e95">NtUserHardErrorControl</a></div><div class="ttdeci">BOOL NtUserHardErrorControl(IN HARDERRORCONTROL dwCmd, IN HDESK hdeskRestore OPTIONAL)</div><div class="ttdef"><b>Definition:</b> <a href="a03614_source.html#l00302">kernel/ntstubs.c:302</a></div></div>
<div class="ttc" id="aa00899_html_a3cda359e32cea29097571bcf911dfccf"><div class="ttname"><a href="a00899.html#a3cda359e32cea29097571bcf911dfccf">SECURITY_ATTRIBUTES</a></div><div class="ttdeci">struct _SECURITY_ATTRIBUTES SECURITY_ATTRIBUTES</div><div class="ttdef"><b>Definition:</b> <a href="a00899_source.html#l00040">userk.h:40</a></div></div>
<div class="ttc" id="aa03260_html_a2d28a753e97e7eae07a42932598cdb7c"><div class="ttname"><a href="a03260.html#a2d28a753e97e7eae07a42932598cdb7c">gdwHardErrorThreadId</a></div><div class="ttdeci">DWORD gdwHardErrorThreadId</div><div class="ttdef"><b>Definition:</b> <a href="a03260_source.html#l00019">server/globals.c:19</a></div></div>
<div class="ttc" id="aa03239_html_a413912b9bd1a3ecf1768857b40cdffaa"><div class="ttname"><a href="a03239.html#a413912b9bd1a3ecf1768857b40cdffaa">CCHBODYMAX</a></div><div class="ttdeci">#define CCHBODYMAX</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00042">server/exitwin.c:42</a></div></div>
<div class="ttc" id="aa03239_html_aa4be6119fd72c33b7a4a76bf7a72762c"><div class="ttname"><a href="a03239.html#aa4be6119fd72c33b7a4a76bf7a72762c">_ExitWindowsEx</a></div><div class="ttdeci">NTSTATUS _ExitWindowsEx(PCSR_THREAD pcsrt, UINT dwFlags, DWORD dwReserved)</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00068">server/exitwin.c:68</a></div></div>
<div class="ttc" id="aa00362_html_af86a9b04196ca170fc6b6e4b4e6a5dbc"><div class="ttname"><a href="a00362.html#af86a9b04196ca170fc6b6e4b4e6a5dbc">NtUserSetInformationThread</a></div><div class="ttdeci">NTSTATUS NtUserSetInformationThread(IN HANDLE hThread, IN USERTHREADINFOCLASS ThreadInfoClass, IN PVOID ThreadInformation, IN ULONG ThreadInformationLength)</div><div class="ttdef"><b>Definition:</b> <a href="a03614_source.html#l06050">kernel/ntstubs.c:6050</a></div></div>
<div class="ttc" id="aa03743_html_a72ab23f7e5d7d08157db573dc8666aff"><div class="ttname"><a href="a03743.html#a72ab23f7e5d7d08157db573dc8666aff">GetWindow</a></div><div class="ttdeci">HWND GetWindow(HWND hwnd, UINT wCmd)</div><div class="ttdef"><b>Definition:</b> <a href="a03743_source.html#l00466">client/wow.c:466</a></div></div>
<div class="ttc" id="aa00899_html_ac2181d07596893ed44d18aa267ce4d23"><div class="ttname"><a href="a00899.html#ac2181d07596893ed44d18aa267ce4d23">LeaveCrit</a></div><div class="ttdeci">VOID LeaveCrit(VOID)</div></div>
<div class="ttc" id="aa03260_html_a90d8991b885c92e4fa39f0cd15d98ece"><div class="ttname"><a href="a03260.html#a90d8991b885c92e4fa39f0cd15d98ece">gfAutoEndTask</a></div><div class="ttdeci">BOOL gfAutoEndTask</div><div class="ttdef"><b>Definition:</b> <a href="a03260_source.html#l00022">server/globals.c:22</a></div></div>
<div class="ttc" id="aa03608_html_afd1a0e78d1f88954d93e48ab3821781f"><div class="ttname"><a href="a03608.html#afd1a0e78d1f88954d93e48ab3821781f">UINT</a></div><div class="ttdeci">typedef UINT(FAR WINAPI *MSGSOUNDPROC)()</div></div>
<div class="ttc" id="aa03260_html_a4438bfeedbb0e0f04b40323c4f2dd016"><div class="ttname"><a href="a03260.html#a4438bfeedbb0e0f04b40323c4f2dd016">gcsUserSrv</a></div><div class="ttdeci">CRITICAL_SECTION gcsUserSrv</div><div class="ttdef"><b>Definition:</b> <a href="a03260_source.html#l00025">server/globals.c:25</a></div></div>
<div class="ttc" id="aa03029_html_a0182b2e472b8af2291079784ca8926c9"><div class="ttname"><a href="a03029.html#a0182b2e472b8af2291079784ca8926c9">_ENDDLGPARAMS::h</a></div><div class="ttdeci">HANDLE h</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00901">server/exitwin.c:901</a></div></div>
<div class="ttc" id="aa03239_html_ad5164087ca1b77435e44c75a73c0538f"><div class="ttname"><a href="a03239.html#ad5164087ca1b77435e44c75a73c0538f">IsPrivileged</a></div><div class="ttdeci">BOOL IsPrivileged(PPRIVILEGE_SET ppSet)</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l01428">server/exitwin.c:1428</a></div></div>
<div class="ttc" id="aa00098_html_aa5a68d879547f0460331c71bee94763a"><div class="ttname"><a href="a00098.html#aa5a68d879547f0460331c71bee94763a">EndDialog</a></div><div class="ttdeci">BOOL EndDialog(HWND hwnd, int result)</div><div class="ttdef"><b>Definition:</b> <a href="a00098_source.html#l00022">dlgend.c:22</a></div></div>
<div class="ttc" id="aa03257_html_a8cebae587f0400eeadc0969475554a1b"><div class="ttname"><a href="a03257.html#a8cebae587f0400eeadc0969475554a1b">dwThreadEndSession</a></div><div class="ttdeci">DWORD dwThreadEndSession</div><div class="ttdef"><b>Definition:</b> <a href="a03257_source.html#l00295">kernel/globals.c:295</a></div></div>
<div class="ttc" id="aa03037_html_aa0d1e08a97071ddf68420bd8d7ec5a39"><div class="ttname"><a href="a03037.html#aa0d1e08a97071ddf68420bd8d7ec5a39">tagHARDERRORINFO::phiNext</a></div><div class="ttdeci">struct tagHARDERRORINFO * phiNext</div><div class="ttdef"><b>Definition:</b> <a href="a00950_source.html#l00090">usersrv.h:90</a></div></div>
<div class="ttc" id="aa03239_html_ad66fd118ce776a77cb84fad3ad8cbd29"><div class="ttname"><a href="a03239.html#ad66fd118ce776a77cb84fad3ad8cbd29">CMDEND_USERSAYSKILL</a></div><div class="ttdeci">#define CMDEND_USERSAYSKILL</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00037">server/exitwin.c:37</a></div></div>
<div class="ttc" id="aa03037_html_acd19c56da3900c4a6f8b1e5e4fbfb71b"><div class="ttname"><a href="a03037.html#acd19c56da3900c4a6f8b1e5e4fbfb71b">tagHARDERRORINFO::pthread</a></div><div class="ttdeci">PCSR_THREAD pthread</div><div class="ttdef"><b>Definition:</b> <a href="a00950_source.html#l00091">usersrv.h:91</a></div></div>
<div class="ttc" id="aa03239_html_a7348244df100929b2981aeaf0f9f9ea0"><div class="ttname"><a href="a03239.html#a7348244df100929b2981aeaf0f9f9ea0">END_LPC_RECV</a></div><div class="ttdeci">#define END_LPC_RECV()</div><div class="ttdef"><b>Definition:</b> <a href="a03239_source.html#l00027">server/exitwin.c:27</a></div></div>
<div class="ttc" id="aa03257_html_a4ae1966258068576cf2be4cc7356924b"><div class="ttname"><a href="a03257.html#a4ae1966258068576cf2be4cc7356924b">hModuleWin</a></div><div class="ttdeci">HANDLE hModuleWin</div><div class="ttdef"><b>Definition:</b> <a href="a03257_source.html#l00324">kernel/globals.c:324</a></div></div>
<!-- start footer part -->
<div id="nav-path" class="navpath"><!-- id is needed for treeview function! -->
  <ul>
    <li class="navelem"><a class="el" href="dir_885cc87fac2d91e269af0a5a959fa5f6.html">E:</a></li><li class="navelem"><a class="el" href="dir_4e091ed8704426a7a4980368ba259fde.html">git</a></li><li class="navelem"><a class="el" href="dir_cd70cb5eb491250157f2d55d3ff4b13e.html">backup</a></li><li class="navelem"><a class="el" href="dir_ba2b673b566ba104b956abdc6dec0552.html">org</a></li><li class="navelem"><a class="el" href="dir_5bb0003d7907b45051943541418399f5.html">ntuser</a></li><li class="navelem"><a class="el" href="dir_379c4bfb2ec80b568b03bb27ff3e2f7e.html">server</a></li><li class="navelem"><a class="el" href="a03239.html">exitwin.c</a></li>
    <li class="footer">制作者
    <a href="http://www.doxygen.org/index.html">
    <img class="footer" src="doxygen.png" alt="doxygen"/></a> 1.8.17 </li>
  </ul>
</div>
</body>
</html>
